Yazar | Ön uç geliştirme danışmanı
Sorumlu Editör | Yu Yan
Üretildi | CSDN (ID: CSDNnews)
Son sonuç
Çevrimiçi deneyim:
Sabırsız doğrudan yemek yemek istiyorsa, şunu tıklayın: kaynak adresi https://github.com/usecodelee/mldrawberry
prensip
Kullanıcılar tarafından yüklenen yüzlere çilek çizmek için birkaç sorunla karşılaşacaksınız:
Bu problemlere dayanarak, bunları çözmek için makine öğrenimini kullanmalıyız!
1. Ön uç makine öğrenimi
Ön uç makine öğrenimi söz konusu olduğunda, akla gelen ilk şey Google'ın TensorFlow'udur:
TensorFlow, uçtan uca açık kaynaklı bir makine öğrenimi platformudur. Çeşitli araçları, kitaplıkları ve topluluk kaynaklarını içeren, araştırmacıların makine öğrenimi alanında gelişmiş teknolojilerin geliştirilmesini teşvik etmesine ve geliştiricilerin makine öğrenimi tarafından desteklenen uygulamaları kolayca oluşturmasına ve dağıtmasına olanak tanıyan kapsamlı ve esnek bir ekosisteme sahiptir.
İlgilenenler bir göz atmak için TensorFlow resmi web sitesine gidebilirler, çok eğlenceli şeyler var.
Tabii ki, biz sadece yüz tanımayı kullanıyoruz. Birisi, yüz-api.js kitaplığını özellikle TensorFlow'a dayalı yüz tanıma için kapsülledi.
2. Temel ilkeler
Ben sadece genel olarak bundan bahsediyorum, sadece belirli içeriği görmeye gidebilecek ilgilenen biriyim.
1. Adım: Tüm yüzleri bulun
Çözüm HOG (Yönlendirilmiş Gradyanların Histogramı) oryantasyon gradyan histogramı, nesne konturlarını algılayabilen bir algoritma.
Adım 2: Yüzün farklı pozları
2014 yılında Vahid Kazemi ve Josephine Sullivan tarafından icat edilen bir yüz simgesi tahmin algoritması kullanın.
Bu algoritmanın temel fikri, 68 yüz üzerinde ortak noktaları (yer işaretleri olarak adlandırılır) bulmaktır:
onların arasında:
Çene çevresi 17 nokta
Sol kaşta 5 puan
Sağ kaşta 5 puan
Burun köprüsünde 4 nokta
Burun ucunda 5 nokta
Sol göz için 6 puan
Sağ göz için 6 puan
Dış dudaklarda 12 nokta
İç dudakta 8 nokta
Bu 68 nokta ile kaşların, gözlerin, burnun ve ağzın pozisyon bilgilerini rahatlıkla bilebiliriz.Bu pozisyon bilgilerinden hareketle başlangıçta bahsedilen sorulara bazı basit hesaplamalar sonrasında cevaplar alabiliyoruz. :
Vue-cli'ye dayalı bir tane yapın
Face-api.js ile başlayabiliriz. Kabaca 4 adıma bölünmüştür:
1. Projeyi inşa etmek için vue-cli iskele kullanın
Hızlıca bir proje oluşturmak için vue-cli kullanın
2. Yüz görüntülerini algılamak ve algılama sonuçları elde etmek için face-api.js kullanın
(1) face-api.js yükleyin
npm i face-api.js(2) Model verilerini yükleyin
Face-api.js kullanmak, yavaş çalışmamızı gerektirmez, modelleri doğrudan kullanabiliriz.
Uygulamanın gereksinimlerine göre ihtiyacınız olan belirli modeli yükleyebilirsiniz. Ancak eksiksiz bir uçtan uca örnek çalıştırmak istiyorsak, yüz algılama, yüz özelliği nokta algılama ve yüz tanıma modellerini de yüklememiz gerekir. İlgili model dosyaları kod havuzunda bulunabilir. Bunları public / models klasörünün altına koyup içe aktarıyoruz:
const MODEL_URL = "/ models"; faceapi.loadSsdMobilenetv1Model (MODEL_URL); await faceapi.loadFaceLandmarkModel (MODEL_URL); await faceapi.loadFaceRecognitionModel (MODEL_URL);Face-api.js'yi bileşenimize aktarın:
"face-api.js" den faceapi olarak içe aktar *;(3) Yüz görüntülerini algılamak ve algılama sonuçları elde etmek için face-api.js kullanın
let input = this. $ refs.inputImg; // Algılanacak resim let canvas = this. $ refs.overlay; // Algılama sonucunun tuvalinin çizilmesini bekleyin const minConfidence = 0.8; fullFaceDescriptions = await faceapi .detectAllFaces (input) .withFaceLandmarks .withFaceDescriptors; // Resmi tespit edin faceapi.matchDimensions (canvas, input); // Tuvali resim const kadar büyük yapın displaySize = {width: input.width, height: input.height}; const resizedDetections = faceapi.resizeResults ( fullFaceDescriptions, displaySize); // Algılama sonuçlarını ve girdi görüntü piksellerini ayarlayın3. Hesaplama (çilek konumu, boyutu, eğim yayı vb.)
(1) Yüz öğelerinin özellik noktası dizisini alın
// Yanak soldan sağa 17 noktadır const jawOutline = resizedDetections.landmarks.getJawOutline; // Burun yukarıdan aşağıya doğru 9 nokta çizilir const burun = resizedDetections.landmarks.getNose; // Ağız 20 noktaya bölünür const mouth = resizedDetections.landmarks.getMouth; // Soldan sağa sol göz için 6 puan const leftEye = resizedDetections.landmarks.getLeftEye; // Sağ göz için soldan sağa 6 nokta const rightEye = resizedDetections.landmarks.getRightEye; // Sol kaş Soldan sağa 5 nokta const leftEyeBbrow = resizedDetections.landmarks.getLeftEyeBrow; // Sağ kaş Soldan sağa 5 nokta const rightEyeBrow = resizedDetections.landmarks.getRightEyeBrow; faceapi.draw.drawDetections (canvas, resizedDetections); / / Resim çerçevesi faceapi.draw.drawFaceLandmarks (canvas, resizedDetections); // noktaları çizÇizimin sonucu aşağıdaki gibidir:
(2) Çilek yerini alın
Çileklerin yerini öğrenmek için önce aşağıdaki resme bakın:
Önce sol ve sağ sarı ve yeşil çizgilerin uzunluklarını karşılaştırın, hangi tarafın uzun olduğunu çizin (fotoğrafın yüzü yanlamasına olabilir), belirli konum soldan sağa farklıdır, sağdaki yeşil çizgi doğrudan çizginin orta noktasından çizilir. , Ve soldaki sarı çizgi, çizginin orta noktasıdır ve çizime başlamak için çilek genişliğinin yarısını sola kaydırın.
Muhtemelen gösterildiği gibi:
Bu yüzden önce 32 ve 16. nokta arasındaki mesafeyi ve ardından orta noktayı alın:
// İki nokta arasındaki mesafeyi alın const getDistance = (a, b) = > {return Math.sqrt (Math.pow (a.x-b.x, 2) + Math.pow (a.y-b.y, 2))) // İki nokta arasındaki orta noktayı alın const getMidPoint = (pa, pb) = > ({x: (pa.x + pb.x) / 2, y: (pa.y + pb.y) / 2})(3) Çilek boyutunu alın
Çileğin boyutu tahmin edilebilir, tüm yüzün genişliğinin yaklaşık 1 / 6'sıdır:
const size = {width: faceWidth / 6, height: faceWidth / 6}(4) Çilek eğimli radyan elde edin
Yüzün eğriliğini kaşların orta noktasına ve çenenin en alt noktasına yani çileğin eğriliğine göre hesaplayabiliriz:
// Yüz sabitinin açısını alın getFaceRadian = (jawPos, midPointOfEyebrows) = > Math.PI-Math.atan2 (jawPos.x-midPointOfEyebrows.x, jawPos.y-midPointOfEyebrows.y)4. çilek çizin
Önceki içerikle çilek çizmek basittir. Önce orijinal resmi yükleyin ve ardından çileği orijinal resme göre çizin:
// çilek fonksiyonu drawBerry (ctx, config, berryUrl) {const {angle, faceWidth, facePos} = config getImg (berryUrl, (img) = > {ctx.save // Kanvasın başlangıç noktasını çileğin çizildiği konuma taşıyın ctx.translate (facePos.point.x, facePos.point.y) // Çileğin döndürülme açısı ctx.rotate (açı) ile aynıdır Çilek konumu const {x, y, width, height} = transBerry (faceWidth, 0, 0, facePos.dir) ctx.drawImage (img, x, y, width, height) ctx.restore})} // Resmi alın function getImg (src, cb) {const img = new Image img.setAttribute ('crossOrigin', 'anonymous') img.src = src img.onload = = > cb (img)}Yer sınırlamaları nedeniyle makalede anahtar kodun sadece bir kısmından bahsedilmiştir.Kodu tam olarak görmeniz gerekiyorsa buraya tıklayabilirsiniz: https://github.com/usecodelee/mldrawberry
Orijinal bağlantı:
https://blog.csdn.net/caomage/article/details/103751111
"Bir milyon insan yapay zekayı öğreniyor" un önemli bir parçası olarak, 2020 AIProCon Geliştirici Konferansı Olacak 26 Haziran Çevrimiçi canlı yayın aracılığıyla geliştiriciler, mevcut AI'nın en son teknoloji araştırması, temel teknolojisi ve uygulaması ve iş vakalarının pratik deneyimi hakkında tek durakta bilgi edinebilir ve ayrıca harika ve çeşitli geliştirici salonlarına ve programlama projelerine çevrimiçi olarak katılabilir. Bir dizi ileriye dönük aktiviteye ve çevrimiçi canlı yayın etkileşimlerine katılın. Yalnızca on binlerce geliştiriciyle iletişim kurmakla kalmaz, aynı zamanda özel canlı yayın hediyeleri kazanma ve teknik uzmanlarla bağlantı kurma fırsatına da sahip olursunuz.
Yorum alanında seçilirseniz, 299 yuan değerinde "2020 AI Geliştiriciler Konferansı" için çevrimiçi canlı bir bilet alacaksınız. Parmaklarınızı hareket ettirin ve söylemek istediklerinizi yazın!
Sıcak makale önerisi
Kubernetes'te PaaS benzeri basit bir platform kurmak çok kolay!
Megvii ikili şube ağı BBN'den bahsediyor: Uzun kuyruklu gerçek dünya görevinin üstesinden gelmek | CVPR 2020 Oral