Name: Towards AI Legal Name: Towards AI, Inc. Description: Towards AI is the world's leading artificial intelligence (AI) and technology publication. Read by thought-leaders and decision-makers around the world. Phone Number: +1-650-246-9381 Email: pub@towardsai.net
228 Park Avenue South New York, NY 10003 United States
Website: Publisher: https://towardsai.net/#publisher Diversity Policy: https://towardsai.net/about Ethics Policy: https://towardsai.net/about Masthead: https://towardsai.net/about
Name: Towards AI Legal Name: Towards AI, Inc. Description: Towards AI is the world's leading artificial intelligence (AI) and technology publication. Founders: Roberto Iriondo, , Job Title: Co-founder and Advisor Works for: Towards AI, Inc. Follow Roberto: X, LinkedIn, GitHub, Google Scholar, Towards AI Profile, Medium, ML@CMU, FreeCodeCamp, Crunchbase, Bloomberg, Roberto Iriondo, Generative AI Lab, Generative AI Lab Denis Piffaretti, Job Title: Co-founder Works for: Towards AI, Inc. Louie Peters, Job Title: Co-founder Works for: Towards AI, Inc. Louis-François Bouchard, Job Title: Co-founder Works for: Towards AI, Inc. Cover:
Towards AI Cover
Logo:
Towards AI Logo
Areas Served: Worldwide Alternate Name: Towards AI, Inc. Alternate Name: Towards AI Co. Alternate Name: towards ai Alternate Name: towardsai Alternate Name: towards.ai Alternate Name: tai Alternate Name: toward ai Alternate Name: toward.ai Alternate Name: Towards AI, Inc. Alternate Name: towardsai.net Alternate Name: pub.towardsai.net
5 stars – based on 497 reviews

Frequently Used, Contextual References

TODO: Remember to copy unique IDs whenever it needs used. i.e., URL: 304b2e42315e

Resources

Take our 85+ lesson From Beginner to Advanced LLM Developer Certification: From choosing a project to deploying a working product this is the most comprehensive and practical LLM course out there!

Publication

Photography + Imaging — the Good, the Bad and the…Oh Dear!
Latest   Machine Learning   Newsletter

Photography + Imaging — the Good, the Bad and the…Oh Dear!

Last Updated on July 24, 2023 by Editorial Team

Author(s): Ted Tuescher

Originally published on Towards AI.

Photo by Verne Ho from Burst.

The Technical Revolution of Photography U+007C Towards AI

Part one of this three-part series reviewed the 190-year history of photography and it’s technical evolution thru early digital transformation. Part two covered a range of recent technical developments in photography and computer vision.

In this final part of the series, we’ll cover some of the challenges presented by the new technology, efforts to mitigate and possible solutions, ending with thoughts on future opportunities.

Many of the technologies mentioned in part 2 present capabilities that aren’t necessarily new. Humans have been able to use software or analog methods to accomplish many of the same tasks for years. Yet the time-intensive nature of arranging pixels manually has restricted the output. But increasingly, as machines are able to perform tasks that only humans could do previously at their famously fast pace, we’re seeing a huge increase in output for both legitimate and questionable purposes. The issue is largely one of scale as the volume of fake imagery explodes along with obvious implications for the integrity of our media.

The Subjective Eye

Imagery has never been a literal representation of reality and therein lies the challenge of detecting fakes. Every visual capture device and medium of representation has its inherent biases and departures from reality. We each see the same thing from a slightly different perspective filtered through our perception, physiology and life experience. Ansel Adams was famous for stating, “The [film] negative is comparable to the composer’s score and the print to its performance. Each performance differs in subtle ways.”

Photographers take many liberties with their imagery to clarify a point of view whether simply over/underexposing an image to removing distracting elements. Even in this digital era, each brand of camera’s RAW data will be slightly different and the software to render that data has a further impact on its representation. More powerful hardware and software algorithms are capturing an increased amount of high fidelity data yet its output is subject to increasingly powerful editing tools that enable subjective interpretations.

Values play a role in this conundrum as well. A distinction between malicious fakes and artistic edits is not always clear, a determination that can vary from person to person such as how fashion photography is retouched to create a more ideal image by some standards yet seen as an unrealistic and damaging portrayal of beauty by others. Relatedly, concern over output from the iPhone’s new front-facing selfie camera and its tendency to smooth facial features has been labeled “Beautygate” though Apple states the result is due to advanced algorithms and “Smart HDR.” Even unaltered imagery can be used to misrepresent when it’s accompanied by a caption to imply a context that supports a political viewpoint.

We’re on The Highway To…

Suffice to say that imagery has always had a subjective nature that we’ve learned to filter into our interpretations. But the new technology is testing the limits of our trust and abilities and compensate for what in the past have been subtle alterations from reality. The new technology has the potential to present a dramatically different and believable depiction that entertains us in movies but horrifies us in politics and the social sphere.

In an effort to forestall governmental misuse, concern for civil liberties and erroneous results, San Francisco banned the use of facial recognition by city agencies as have Somerville, Massachusetts and Oakland, California. Indeed it’s a technology that is proliferating quickly. While the ban is controversial, it’s also forward-thinking. Once the genie is freed, it’s hard to put it back in the bottle and this is far from the first time technology has moved faster than policy. An independent evaluation of the London police’s facial recognition system determined the results wouldn’t hold up in a court challenge as it found an error rate of 81%. Accuracy will certainly improve but bans and questions over facial recognition will hopefully force a healthy policy debate over its implementation.

DeepNude, software enabling the removal of women’s clothing to produce realistic-looking images via neural networks made a brief appearance until the developer agreed to remove access, recognizing how quickly it was proliferating and acknowledging its likely misuse and harm. Unfortunately, it’s not likely this or similar software has disappeared permanently. There could be useful applications for a feature of this sort in medicine for say, reconstructive surgery but it’s such a short distance between proper and improper or malicious use, which illustrates the challenge for how software technology is managed.

Rescue from Fakery?

The alteration of imagery isn’t new. One of the earliest examples is an iconic photo of Abraham Lincoln from 1860 where his head was placed on another person’s body. Stalin was known for airbrushing his enemies out of the picture.

But with the dissemination of fake media including Russian interference in the 2016 US presidential election, increase in revenge porn and personal character attacks, efforts to identify suspect media have escalated. Detection of altered imagery first became a bigger focus around 2004 and has intensified since using various methodologies. Many companies including Facebook, realizing the potential damage, risk and some degree of responsibility, are developing tools to detect the image and video fakes. Even early versions of scanning software and Photoshop had tools to prevent the replication of paper currency.

Adobe and UC Berkeley shared initial efforts to detect altered faces. The US government is fostering a detection platform through DARPA’s Media Forensics unit. Other organizations are popping up to defend against AI run-amok like the AI Foundation which is creating Reality Defender, a browser plugin to alert users to suspected fakes, and SurfSafe, a Chrome plugin by a couple of UC Berkeley undergrads that compares an image to 100+ trusted sites.

The New York Times in partnership with IBM Garage is experimenting with securing image and video metadata via blockchain technology in The News Provenance Project. The approach may enable readers to determine an image or video’s source and whether the media was altered after publication.

Battling fakery can’t succeed entirely through robot police patrolling the internet. There must be some ownership and accountability over the creation and distribution of content production tools. Architects of physical spaces recognize how structure affects the nature and quality of human interaction and community. A big part of the architecture is devoted to designing buildings and homes to improve the quality of life. Today, software architects and engineers are able to leverage powerful open source software and produce finished products with easy access to global distribution at virtually no cost. There’s no reason why concerns applied to physical spaces can’t be applied to software in a similar fashion. Some level of self-regulation would be wise for both social good and to forestall cumbersome external regulation and licensing that other professions face that also have a large impact on public welfare — architects, builders, lawyers, medical professions. The recent emphasis on “empathy” as a value in software design is encouraging but is only a small step forward.

Anticipating misuse of a valuable tool can be challenging. At their time of introduction, it’s doubtful anyone could have envisioned what Facebook, Twitter, and Instagram would become today, with all their benefits and challenges. Yet, the software is a tool and like any tool, it can be used for good or ill. Thoughtful consideration as to the potential for harm should be exercised throughout the design, development, and distribution of new software. And in some cases, automated monitoring of tools-in-use may have value.

With respect to media and content authoring, one approach may be for content software to write a history of edits and dates into an image or video file to enumerate changes, metadata that can be read by open source tools as a means of evaluation and validation. It’s not a foolproof approach but it may stem the tide and offer a level of transparency.

Detection is a cat-and-mouse game that likely has no end as hackers find new ways to disrupt. The ultimate solution will require multifaceted approaches combining author accountability, policy, law, specialized tools and a healthy dose of skepticism.

What, Me Worry?

Civil society depends on accurate information. There’s a good reason for the First Amendment of the US Constitution as a centerpiece of our democratic society to ensure everyone has a voice to express truth. Various legal challenges over time have further defined the boundaries of this right, enforcing limits to speech that harms, defrauds or defames. Yet the introduction of machines that operate near light speed and in potentially anonymous online venues presents significant challenges, especially with fake imagery and video that are becoming so convincing. Some believe the current political polarization in the US and UK, particularly with regard to Brexit, is due in some part to outside forces manipulating information in social and news channels. At scale, fake news and imagery become very serious problems.

The human brain has evolved to process imagery at a deep emotional level. Various studies demonstrate the impact of comforting or threatening imagery on physiological measures like heart-rate and blood-pressure. We choose to have artwork on the walls of our homes for its influence on our mood and well-being. Imagery is very evocative — it’s challenging for us to supersede our emotional response with an intellectual response like doubt over its authenticity.

It behooves academia and industry to instill a sense of social responsibility among the software development disciplines with an awareness of the potential damage to our social and political fabric. The status quo of allowing our fascination with technology to drive its dissemination with little regard for its impact has undermined our well being in many ways. The creation of new roles for social and ethical governance, complementing those already focused on privacy and security would help in this regard.

Keeping Eyes Out

From the looks of it, photography isn’t dead but appears quite vibrant. Some of the trends are concerning and photography as a whole may be harder to define — the discipline encompasses more than it has in the past.

Smartphones have led to broader use of photography for documentation and communication of personal experiences. In a time-constrained era, static imagery and video have become the de facto means to transmit a lot of info quickly though in many cases, less precisely than words.

In the creative realm, photography and imaging benefit from consideration as a performance. Marshaling resources, location, timing, editing and the objective behind a shot are all part of the performance and provide context for understanding. The moment of exposure is more about capturing data whereas everything prior and up to and including publishing contribute to its meaning.

What’s next for photography and imaging? Looking into the crystal ball offers a few clues.

  • Curved image sensors will lead to significant improvements in image quality. They approximate the curvature of a lens and are not far from commercialization and promise to solve some of the distortion and loss in resolution and light when distance increases from the axis of the lens — commonly seen in the corners of today’s imagery.
  • The opportunity behind the computational photo has only just been tapped. Neural network training and algorithms will continue to improve, enabling a better quality of output which is also a dependency for self-driving vehicles.
  • Going forward, we’ll see more data incorporated into algorithms to create smarter imaging platforms and new insights that reach beyond image data. Merging imagery with spatial data will enable dimensional awareness of rooms, places, and terrain which offers many direct benefits apart from enabling additional capabilities, AR and VR being obvious uses.
  • Medical applications offer big opportunities, especially when large datasets of photographic information are combined with genetic data, medical treatment, and outcome data and other indicators such as lab results and existing imaging like thermal, CT and MRI scans. Neural networks will uncover new associations and indicators of health and disease. When applied longitudinally over time, this has the potential for medical insights at a personalized level and earlier identification of risk and detection of disease.

To those of you following along, thank you for reading! It’s certain our collective imagination and learnings will bring other interesting developments to impact not only medicine but entertainment, art, commerce, design, and the environment as well. Interesting times. Stay tuned!

Join thousands of data leaders on the AI newsletter. Join over 80,000 subscribers and keep up to date with the latest developments in AI. From research to projects and ideas. If you are building an AI startup, an AI-related product, or a service, we invite you to consider becoming a sponsor.

Published via Towards AI

Feedback ↓

Sign Up for the Course
`; } else { console.error('Element with id="subscribe" not found within the page with class "home".'); } } }); // Remove duplicate text from articles /* Backup: 09/11/24 function removeDuplicateText() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, strong'); // Select the desired elements const seenTexts = new Set(); // A set to keep track of seen texts const tagCounters = {}; // Object to track instances of each tag elements.forEach(el => { const tagName = el.tagName.toLowerCase(); // Get the tag name (e.g., 'h1', 'h2', etc.) // Initialize a counter for each tag if not already done if (!tagCounters[tagName]) { tagCounters[tagName] = 0; } // Only process the first 10 elements of each tag type if (tagCounters[tagName] >= 2) { return; // Skip if the number of elements exceeds 10 } const text = el.textContent.trim(); // Get the text content const words = text.split(/\s+/); // Split the text into words if (words.length >= 4) { // Ensure at least 4 words const significantPart = words.slice(0, 5).join(' '); // Get first 5 words for matching // Check if the text (not the tag) has been seen before if (seenTexts.has(significantPart)) { // console.log('Duplicate found, removing:', el); // Log duplicate el.remove(); // Remove duplicate element } else { seenTexts.add(significantPart); // Add the text to the set } } tagCounters[tagName]++; // Increment the counter for this tag }); } removeDuplicateText(); */ // Remove duplicate text from articles function removeDuplicateText() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, strong'); // Select the desired elements const seenTexts = new Set(); // A set to keep track of seen texts const tagCounters = {}; // Object to track instances of each tag // List of classes to be excluded const excludedClasses = ['medium-author', 'post-widget-title']; elements.forEach(el => { // Skip elements with any of the excluded classes if (excludedClasses.some(cls => el.classList.contains(cls))) { return; // Skip this element if it has any of the excluded classes } const tagName = el.tagName.toLowerCase(); // Get the tag name (e.g., 'h1', 'h2', etc.) // Initialize a counter for each tag if not already done if (!tagCounters[tagName]) { tagCounters[tagName] = 0; } // Only process the first 10 elements of each tag type if (tagCounters[tagName] >= 10) { return; // Skip if the number of elements exceeds 10 } const text = el.textContent.trim(); // Get the text content const words = text.split(/\s+/); // Split the text into words if (words.length >= 4) { // Ensure at least 4 words const significantPart = words.slice(0, 5).join(' '); // Get first 5 words for matching // Check if the text (not the tag) has been seen before if (seenTexts.has(significantPart)) { // console.log('Duplicate found, removing:', el); // Log duplicate el.remove(); // Remove duplicate element } else { seenTexts.add(significantPart); // Add the text to the set } } tagCounters[tagName]++; // Increment the counter for this tag }); } removeDuplicateText(); //Remove unnecessary text in blog excerpts document.querySelectorAll('.blog p').forEach(function(paragraph) { // Replace the unwanted text pattern for each paragraph paragraph.innerHTML = paragraph.innerHTML .replace(/Author\(s\): [\w\s]+ Originally published on Towards AI\.?/g, '') // Removes 'Author(s): XYZ Originally published on Towards AI' .replace(/This member-only story is on us\. Upgrade to access all of Medium\./g, ''); // Removes 'This member-only story...' }); //Load ionic icons and cache them if ('localStorage' in window && window['localStorage'] !== null) { const cssLink = 'https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css'; const storedCss = localStorage.getItem('ionicons'); if (storedCss) { loadCSS(storedCss); } else { fetch(cssLink).then(response => response.text()).then(css => { localStorage.setItem('ionicons', css); loadCSS(css); }); } } function loadCSS(css) { const style = document.createElement('style'); style.innerHTML = css; document.head.appendChild(style); } //Remove elements from imported content automatically function removeStrongFromHeadings() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, h6, span'); elements.forEach(el => { const strongTags = el.querySelectorAll('strong'); strongTags.forEach(strongTag => { while (strongTag.firstChild) { strongTag.parentNode.insertBefore(strongTag.firstChild, strongTag); } strongTag.remove(); }); }); } removeStrongFromHeadings(); "use strict"; window.onload = () => { /* //This is an object for each category of subjects and in that there are kewords and link to the keywods let keywordsAndLinks = { //you can add more categories and define their keywords and add a link ds: { keywords: [ //you can add more keywords here they are detected and replaced with achor tag automatically 'data science', 'Data science', 'Data Science', 'data Science', 'DATA SCIENCE', ], //we will replace the linktext with the keyword later on in the code //you can easily change links for each category here //(include class="ml-link" and linktext) link: 'linktext', }, ml: { keywords: [ //Add more keywords 'machine learning', 'Machine learning', 'Machine Learning', 'machine Learning', 'MACHINE LEARNING', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, ai: { keywords: [ 'artificial intelligence', 'Artificial intelligence', 'Artificial Intelligence', 'artificial Intelligence', 'ARTIFICIAL INTELLIGENCE', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, nl: { keywords: [ 'NLP', 'nlp', 'natural language processing', 'Natural Language Processing', 'NATURAL LANGUAGE PROCESSING', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, des: { keywords: [ 'data engineering services', 'Data Engineering Services', 'DATA ENGINEERING SERVICES', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, td: { keywords: [ 'training data', 'Training Data', 'training Data', 'TRAINING DATA', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, ias: { keywords: [ 'image annotation services', 'Image annotation services', 'image Annotation services', 'image annotation Services', 'Image Annotation Services', 'IMAGE ANNOTATION SERVICES', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, l: { keywords: [ 'labeling', 'labelling', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, pbp: { keywords: [ 'previous blog posts', 'previous blog post', 'latest', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, mlc: { keywords: [ 'machine learning course', 'machine learning class', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, }; //Articles to skip let articleIdsToSkip = ['post-2651', 'post-3414', 'post-3540']; //keyword with its related achortag is recieved here along with article id function searchAndReplace(keyword, anchorTag, articleId) { //selects the h3 h4 and p tags that are inside of the article let content = document.querySelector(`#${articleId} .entry-content`); //replaces the "linktext" in achor tag with the keyword that will be searched and replaced let newLink = anchorTag.replace('linktext', keyword); //regular expression to search keyword var re = new RegExp('(' + keyword + ')', 'g'); //this replaces the keywords in h3 h4 and p tags content with achor tag content.innerHTML = content.innerHTML.replace(re, newLink); } function articleFilter(keyword, anchorTag) { //gets all the articles var articles = document.querySelectorAll('article'); //if its zero or less then there are no articles if (articles.length > 0) { for (let x = 0; x < articles.length; x++) { //articles to skip is an array in which there are ids of articles which should not get effected //if the current article's id is also in that array then do not call search and replace with its data if (!articleIdsToSkip.includes(articles[x].id)) { //search and replace is called on articles which should get effected searchAndReplace(keyword, anchorTag, articles[x].id, key); } else { console.log( `Cannot replace the keywords in article with id ${articles[x].id}` ); } } } else { console.log('No articles found.'); } } let key; //not part of script, added for (key in keywordsAndLinks) { //key is the object in keywords and links object i.e ds, ml, ai for (let i = 0; i < keywordsAndLinks[key].keywords.length; i++) { //keywordsAndLinks[key].keywords is the array of keywords for key (ds, ml, ai) //keywordsAndLinks[key].keywords[i] is the keyword and keywordsAndLinks[key].link is the link //keyword and link is sent to searchreplace where it is then replaced using regular expression and replace function articleFilter( keywordsAndLinks[key].keywords[i], keywordsAndLinks[key].link ); } } function cleanLinks() { // (making smal functions is for DRY) this function gets the links and only keeps the first 2 and from the rest removes the anchor tag and replaces it with its text function removeLinks(links) { if (links.length > 1) { for (let i = 2; i < links.length; i++) { links[i].outerHTML = links[i].textContent; } } } //arrays which will contain all the achor tags found with the class (ds-link, ml-link, ailink) in each article inserted using search and replace let dslinks; let mllinks; let ailinks; let nllinks; let deslinks; let tdlinks; let iaslinks; let llinks; let pbplinks; let mlclinks; const content = document.querySelectorAll('article'); //all articles content.forEach((c) => { //to skip the articles with specific ids if (!articleIdsToSkip.includes(c.id)) { //getting all the anchor tags in each article one by one dslinks = document.querySelectorAll(`#${c.id} .entry-content a.ds-link`); mllinks = document.querySelectorAll(`#${c.id} .entry-content a.ml-link`); ailinks = document.querySelectorAll(`#${c.id} .entry-content a.ai-link`); nllinks = document.querySelectorAll(`#${c.id} .entry-content a.ntrl-link`); deslinks = document.querySelectorAll(`#${c.id} .entry-content a.des-link`); tdlinks = document.querySelectorAll(`#${c.id} .entry-content a.td-link`); iaslinks = document.querySelectorAll(`#${c.id} .entry-content a.ias-link`); mlclinks = document.querySelectorAll(`#${c.id} .entry-content a.mlc-link`); llinks = document.querySelectorAll(`#${c.id} .entry-content a.l-link`); pbplinks = document.querySelectorAll(`#${c.id} .entry-content a.pbp-link`); //sending the anchor tags list of each article one by one to remove extra anchor tags removeLinks(dslinks); removeLinks(mllinks); removeLinks(ailinks); removeLinks(nllinks); removeLinks(deslinks); removeLinks(tdlinks); removeLinks(iaslinks); removeLinks(mlclinks); removeLinks(llinks); removeLinks(pbplinks); } }); } //To remove extra achor tags of each category (ds, ml, ai) and only have 2 of each category per article cleanLinks(); */ //Recommended Articles var ctaLinks = [ /* ' ' + '

Subscribe to our AI newsletter!

' + */ '

Take our 85+ lesson From Beginner to Advanced LLM Developer Certification: From choosing a project to deploying a working product this is the most comprehensive and practical LLM course out there!

'+ '

Towards AI has published Building LLMs for Production—our 470+ page guide to mastering LLMs with practical projects and expert insights!

' + '
' + '' + '' + '

Note: Content contains the views of the contributing authors and not Towards AI.
Disclosure: This website may contain sponsored content and affiliate links.

' + 'Discover Your Dream AI Career at Towards AI Jobs' + '

Towards AI has built a jobs board tailored specifically to Machine Learning and Data Science Jobs and Skills. Our software searches for live AI jobs each hour, labels and categorises them and makes them easily searchable. Explore over 10,000 live jobs today with Towards AI Jobs!

' + '
' + '

🔥 Recommended Articles 🔥

' + 'Why Become an LLM Developer? Launching Towards AI’s New One-Stop Conversion Course'+ 'Testing Launchpad.sh: A Container-based GPU Cloud for Inference and Fine-tuning'+ 'The Top 13 AI-Powered CRM Platforms
' + 'Top 11 AI Call Center Software for 2024
' + 'Learn Prompting 101—Prompt Engineering Course
' + 'Explore Leading Cloud Providers for GPU-Powered LLM Training
' + 'Best AI Communities for Artificial Intelligence Enthusiasts
' + 'Best Workstations for Deep Learning
' + 'Best Laptops for Deep Learning
' + 'Best Machine Learning Books
' + 'Machine Learning Algorithms
' + 'Neural Networks Tutorial
' + 'Best Public Datasets for Machine Learning
' + 'Neural Network Types
' + 'NLP Tutorial
' + 'Best Data Science Books
' + 'Monte Carlo Simulation Tutorial
' + 'Recommender System Tutorial
' + 'Linear Algebra for Deep Learning Tutorial
' + 'Google Colab Introduction
' + 'Decision Trees in Machine Learning
' + 'Principal Component Analysis (PCA) Tutorial
' + 'Linear Regression from Zero to Hero
'+ '

', /* + '

Join thousands of data leaders on the AI newsletter. It’s free, we don’t spam, and we never share your email address. Keep up to date with the latest work in AI. From research to projects and ideas. If you are building an AI startup, an AI-related product, or a service, we invite you to consider becoming a sponsor.

',*/ ]; var replaceText = { '': '', '': '', '
': '
' + ctaLinks + '
', }; Object.keys(replaceText).forEach((txtorig) => { //txtorig is the key in replacetext object const txtnew = replaceText[txtorig]; //txtnew is the value of the key in replacetext object let entryFooter = document.querySelector('article .entry-footer'); if (document.querySelectorAll('.single-post').length > 0) { //console.log('Article found.'); const text = entryFooter.innerHTML; entryFooter.innerHTML = text.replace(txtorig, txtnew); } else { // console.log('Article not found.'); //removing comment 09/04/24 } }); var css = document.createElement('style'); css.type = 'text/css'; css.innerHTML = '.post-tags { display:none !important } .article-cta a { font-size: 18px; }'; document.body.appendChild(css); //Extra //This function adds some accessibility needs to the site. function addAlly() { // In this function JQuery is replaced with vanilla javascript functions const imgCont = document.querySelector('.uw-imgcont'); imgCont.setAttribute('aria-label', 'AI news, latest developments'); imgCont.title = 'AI news, latest developments'; imgCont.rel = 'noopener'; document.querySelector('.page-mobile-menu-logo a').title = 'Towards AI Home'; document.querySelector('a.social-link').rel = 'noopener'; document.querySelector('a.uw-text').rel = 'noopener'; document.querySelector('a.uw-w-branding').rel = 'noopener'; document.querySelector('.blog h2.heading').innerHTML = 'Publication'; const popupSearch = document.querySelector$('a.btn-open-popup-search'); popupSearch.setAttribute('role', 'button'); popupSearch.title = 'Search'; const searchClose = document.querySelector('a.popup-search-close'); searchClose.setAttribute('role', 'button'); searchClose.title = 'Close search page'; // document // .querySelector('a.btn-open-popup-search') // .setAttribute( // 'href', // 'https://medium.com/towards-artificial-intelligence/search' // ); } // Add external attributes to 302 sticky and editorial links function extLink() { // Sticky 302 links, this fuction opens the link we send to Medium on a new tab and adds a "noopener" rel to them var stickyLinks = document.querySelectorAll('.grid-item.sticky a'); for (var i = 0; i < stickyLinks.length; i++) { /* stickyLinks[i].setAttribute('target', '_blank'); stickyLinks[i].setAttribute('rel', 'noopener'); */ } // Editorial 302 links, same here var editLinks = document.querySelectorAll( '.grid-item.category-editorial a' ); for (var i = 0; i < editLinks.length; i++) { editLinks[i].setAttribute('target', '_blank'); editLinks[i].setAttribute('rel', 'noopener'); } } // Add current year to copyright notices document.getElementById( 'js-current-year' ).textContent = new Date().getFullYear(); // Call functions after page load extLink(); //addAlly(); setTimeout(function() { //addAlly(); //ideally we should only need to run it once ↑ }, 5000); }; function closeCookieDialog (){ document.getElementById("cookie-consent").style.display = "none"; return false; } setTimeout ( function () { closeCookieDialog(); }, 15000); console.log(`%c 🚀🚀🚀 ███ █████ ███████ █████████ ███████████ █████████████ ███████████████ ███████ ███████ ███████ ┌───────────────────────────────────────────────────────────────────┐ │ │ │ Towards AI is looking for contributors! │ │ Join us in creating awesome AI content. │ │ Let's build the future of AI together → │ │ https://towardsai.net/contribute │ │ │ └───────────────────────────────────────────────────────────────────┘ `, `background: ; color: #00adff; font-size: large`); //Remove latest category across site document.querySelectorAll('a[rel="category tag"]').forEach(function(el) { if (el.textContent.trim() === 'Latest') { // Remove the two consecutive spaces (  ) if (el.nextSibling && el.nextSibling.nodeValue.includes('\u00A0\u00A0')) { el.nextSibling.nodeValue = ''; // Remove the spaces } el.style.display = 'none'; // Hide the element } }); // Add cross-domain measurement, anonymize IPs 'use strict'; //var ga = gtag; ga('config', 'G-9D3HKKFV1Q', 'auto', { /*'allowLinker': true,*/ 'anonymize_ip': true/*, 'linker': { 'domains': [ 'medium.com/towards-artificial-intelligence', 'datasets.towardsai.net', 'rss.towardsai.net', 'feed.towardsai.net', 'contribute.towardsai.net', 'members.towardsai.net', 'pub.towardsai.net', 'news.towardsai.net' ] } */ }); ga('send', 'pageview'); -->