رویکرد دیگر در سال 2014 به این صورت بود که تشخیص چهره را به صورت کلاس بندی باینری ببینیم اینگونه که دو عکس مورد بررسی را به شبکه بده و در انتها لایه 128 را وصل کن به یک binary classifier که اگه دو نفر یکسان بودند true و در غیر این صورت، false برمیگرداند.
دیتا ست در این رویکرد به صورت زیر است که یه مجموعه مقایسه ایست که یکسان بودن و نبودن را بیان می کنند و batch هم ظریب 2 می شود.
باز میبینیم که تعدادحالت های ما بسیار زیاد می شود.
Center loss
برای تصویر تنها تفکیک پذیر(separable) بودن مهم نیست بلکه باید یک فاصله ایی هم در فضا از هم داشته باشند.( discriminative باشند)
فیچر های ماقبل لایه آخر (encoding) درهر mini_batch ، این 128 ها را میانگین بگیرد و loss را طوری تعریف می کنیم که علاوه بر softmax همه به سنترمشخص شده نزدیک تر بشن.


1 2 |
from keras import backend as K K.set_image_data_format('channels_first') |
کانال عکس ابتدا وارد می شود.
1 |
FRmodel = faceRecoModel(input_shape=(3, 96, 96)) |
یک شبکه را لود کردیم با پارامتر های تعداد کانال و سایز عکس ها که 96 * 96 است.
1 |
FRmodel.compile(optimizer = 'adam', loss = triplet_loss, metrics = ['accuracy']) |
در کامپایل پارامتر loss را تابعی که خودمان برای loss triplet نوشتیه ایم میگذاریم.
1 |
load_weights_from_FaceNet(FRmodel) |
وزن های قبلا train شده را در شبکه خودمون لود میکنیم.
1 |
database["danielle"] = img_to_encoding("images/danielle.png", FRmodel) |
عکس را داده و خروجی 128 تایی لایه آخر شبکه را در یک دیکشنری ذخیره میکنیم.
1 |
verify("images/camera_0.jpg", "younes", database, FRmodel) |
تابعی که عکس را گرفته و فاصله اقلیدسی آن را با عکس های موجود در دیتاست محاسبه کرده (threshold که براساس تست یافته ایم، cross validtion باید بزنیم تا بهترین کارایی برسیم.)و می گوید این عکس داده شده همان لیبل هست یا نه. true و false برگردان.
پارامتر ها:
- عکس
- لیبل عکس
- دیتاست
- مدل شبکه
1who_is_it("images/camera_0.jpg", database, FRmodel)
تابعی که عکس را گرفته و recognation انجام می دهد، به این صورت که encoding عکس را از مدل گرفته و در تمام دیتاست موجود چک می شود اگر فاصله اقلیدسی آن از min_dist کوچکتر باشد نام آن را بر می گرداند.
شبکه های اجتماعی