به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

0 امتیاز

سلام
من میخاستم از اسکریپتی که شما نوشتید برای استخراج ویژگی استفاده کنم. ولی به ارور برمیخورم. مراحلی که انجام دادم را توضیح میدم:
1- ادرس دهی کافی روت در خط5 و ادرس دهی model_prototxt که دیپلوی با بچ یک رو قرار دادم و ادرس دهی model_trained که کفی مدل مورد استفاده ام هستش و ادرس دهی imagenet_labels که به فایل تکست تصاویر تستم اشاره می کنه و ادرس دهی mean_path که با استفاده از اسکریپت تونستم فایل باینری پروتو را به npy تبدیل کنم و ادرس دهیش کنم.
2- نام لایه ای که میخوام فیچرهاشو استحراح کنم fc7_changed هست پس این متغیر را اینجوری گذاشتم :

layer_name = 'fc7_changed'

3- اینپوت فایل را برابر یکی از تصاویر تستم گذاشتم :

inputfile = 'C:/Users/KamanGir/Desktop/veritydataset/dataset3/test/1/
001.1_Right_Front.JPG'

4- اوت پوت فایل یعنی جایی که قرار هست فیچر هامون اونجا نوشته بشن رو در یک فایل تکست مینویسم:

outputfile = 'C:/Users/KamanGir/Desktop/d.txt'

5-تصاویرم خاکستری و با سایز 308 در 308 هستند پس این خطوط زیر را نوشتم :

channel_swap=(2,1,0),
raw_scale=255,
image_dims=(308, 308))

البته channel_swap نمیدونم چیه. دست نزدم.
6- خط 73 هم نام لایه ای که میخوام استخراج کنم را دستی نوشتم :

np.savetxt(writer, net.blobs['fc7_changed'].data[0].reshape(1,-1),
 fmt='%.8g')

وقتی میخام این اسکریپ را اجرا کنم پس از اینکه شبکه و لایه ها را کامل نشون داد، موقعی که میخواد تصویر ورودی را بخونه با خطای زیر مواجه میشم :

Traceback (most recent call last):
File "C:\Users\KamanGir\Downloads\successful_cmake_caffe_build\caffe-windows\
caffe-windows\python\caffe_feature_extractor.py", line 76, in <module>
main(sys.argv[1:])  File "C:\Users\KamanGir\Downloads\successful_cmake_caffe_build\
caffe-windows\  caffe-windows\python\caffe_feature_extractor.py", line 70, 
in main  input_image = caffe.io.load_image(image_path)
File "C://Users//KamanGir//Downloads//successful_cmake_caffe_build//caffe-windows//caffe-windows//python\caffe\io.py", 
line 296, in load_image  img = skimage.img_as_float(skimage.io.imread(filename, 
as_grey=not color)).astype(np.float32)  File "C:\Users\KamanGir\Anaconda3\lib\
site-packages\skimage\io\_io.py", line 61,
in imread  img = call_plugin('imread', fname, plugin=plugin, **plugin_args)
File "C:\Users\KamanGir\Anaconda3\lib\site-packages\skimage\io\manage_plugins.py",
line 211, in call_plugin  return func(*args, **kwargs)
File "C:\Users\KamanGir\Anaconda3\lib\site-packages\skimage\io\_plugins\pil_plugin.py", line 35, in imread with open(fname, 'rb') as f:
ValueError: embedded null character

فکر میکنم کاراکترهای رشته ورودی که حاوی ادرس تصویرم هست را null در نظر میگیره. میشه بفرمایید مشکل از کجاست؟
مرسی

توسط (150 امتیاز)
سلام . همیشه اگه از اسکریپتی استفاده میکنید لینک کنید.
بعد از اینکه اطلاعات رو اضافه کردید لطفا اطلاع بدید.
ضمنا لطف کنید حتما کد رو ادیت کنید. تا کدها خوانایی داشته باشند.
سلام
از اسکریپ خودتون استفاده کردم . لینکش :
https://gist.github.com/Coderx7/cb3da113a46a1e4fbc5dbbd3eb402ccb

1 پاسخ

0 امتیاز

سلام .
اشکال از اسکریپت نیست .
برای تصویر gray scale به تابع caffe.io.load_image() پارامتر دوم رو False بفرستید. بعد تست کنید.

توسط (4.3k امتیاز)
سلام
پارامتر color این تابع هم false کردم ولی جواب نداد.
یه کار دیگه کردم. ادرس تصاویر ورودی را در یک فایل قرار دادم و از اونجا ادرس تصاویر رو خوندم.
اسکریپت رم یه تغییراتی توش دادم چون فکر میکنم بخاطر فرمت انکد و دیکدی که کفی استفاده میکنه و سازگار نیست با فرمت انکد ویندوز، یه همچین اروری اتفاق میفته و تابع strip() هم نمیتونه کاملا همه null ها را حذف کنه. تغییری که دادم این بود:
در خط 66: with open(outputfile, 'wb') as writer:
در خط 73 : fmt='%.5f'
نتیجه این شد که وارد مرحله تزریق تصاویر به شبکه میشه  ونتیجه پیش بینی را به ازای هر تصویر نشون میده .در فایل خروجی هم بردار ویژگی را چاب میکنه. اما سوالی که دارم اینه. چرا با وجود اینکه شبکه من 98 درصد دقت داره و این 98 هم اتفاقا روی فاز تست هست، ولی پیش بینی تصاویر اینقد بد عمل میکنه و اکثر عکسا رو با لیبل اشتباه بیش بینی میکنه؟ یه نگاه به خروجی زیر بندازید. اگر تفسیر غلطی از این بیش بینی دارم لطفا کمکم کنید؟ ایا همیشه مدلش همینه یا اینکه شبکه من مشکلی داره:
001.1_Right_Front.JPG : /13/013.1_Right_Down.JPG 13 ( 0.594432 )
مثلا باید بگه این تصویر لیبلش یک هست، ولی اشتباها میگه 13. خییلی از تصاویرم اینجوری میشن
سلام .
در مورد دقت شما دونکته رو باید بهش توجه کنید. اگه پیش پردازش خاصی انجام میدید اینجا هم باید لحاظ کنید. در صورتی که بحث پیش پردازشی در میون نیست و مراحل یکیه  در صورتی که دیتاست شما به اندازه کافی بزرگ نباشه (جامع نباشه از لحاظ پوشش نمونه ها) این مشکل بوجود میاد و صرف گرفتن دقت بالا در دیتاستتون ملاک نیست و نکته شایعی هم هست. یه نکته دیگه هم بحث میانگین هست که اطمینان حاصل کنید درست انجامش میدید. میتونید برای تست میانگین رو لحاظ نکنید یا اینکه وقتی لحاظ میکنید روی تصاویری که قبلا تست گرفتید تست کنید ببینید همون دقت رو میگیرید یا نه . اینطوری اون فاز پیش پردازش و میانگین رو چک کنید.  
تو بحث دقت ولیدیشن دو نکته خیلی مهمه 1. تا جای ممکن باید جامع باشه یا نمونه های مختلف از داده در دنیای اصلی رو داشته باشه نه اینکه صرفا بقول معروف یک ساب ستی انتخاب شده باشه از داده ها و رو اون کار شده باشه . 2. تعداد نمونه ها مناسب باشه .
وقتی هم دیتای شما کمه از کراس ولیدیشن برای محک معماریتون استفاده کنید تا ایده بگیرید مشکل شما از کجا نشآت میگیره .
فک نمیکنم داده ام کم باشه برای فاین تیونی که انجام میدم. من 168 پوشه عکس دارم که توی هر کدومشون 144 عکسه. 130 تا برای ترین و باقیش برای تست.
پیش پردازش خاصی که انجام نمیدم. پس از اون نباید باشه. فایل میانگین با پسوند باینری پروتو برای تصاویر ترین من دارای مقدار40.4639 برای هر سه کانال هستش و همین فایل برای تصاویر تست مقادیر40.4389 رو برای هر سه کانال داره. ولی وقتی که فایل میانگین مربوط به ترین را تبدیل به فرمت.npy میکنم، مقدار284592 را نشون میده و فایلشو میسازه. برای فایل مربوط به تست هم همین مقدار رو نشون میده و فایل .npy اش رو میسازه. به نظرم یه جای کار خرابه که داره برای هر دوفایل یه عدد رو میگه درسته؟
با این وجود من فایل میانگین.npy را به کل برداشتم از اسکریپت استخراج ویژگی و ران کردم. این بار بدتر شد. یعنی فکر میکنم از میانگین هم نیست. اسکریپتی که برای تبدیل باینری پروتو به .npy استفاده کردم اینه. ایا این اشتباهه؟:
# Make sure that caffe is on the python path:
caffe_root = 'C:/Users/KamanGir/Downloads/successful_cmake_caffe_build/caffe-windows/caffe-windows/'  # this file is expected to be in {caffe_root}/examples
import sys
sys.path.insert(0, caffe_root + 'python')
import caffe
import numpy as np

#Convert mean file produced by Caffe to numpy array, assume 3 chanels
#python bin_to_npy.py dim_image_mean path_to_mean_caffe name_output

channels = 3

a = caffe.io.caffe_pb2.BlobProto()
with open(sys.argv[2],'rb') as f:
  a.ParseFromString(f.read())

means=a.data
means=np.asarray(means)
print (means.shape)
s = int(sys.argv[1])
means=means.reshape(channels,s,s)
print (means)
np.save(sys.argv[3],means)
سلام .
شما از یه میانگین برای همه استفاده میکنید. قرار نیست میانگین ترینینگ جدا میانگین تست رو جدا محاسبه و استفاده کنید. میانگین رو از ترینینگ بدست میارید بعد روی داده تست استفاده میکنید.
من خودم زمانهایی که دقتها مشکل داشتن بیشتر بحث میانگین دخیل بوده . کاری که عرض کردم رو انجام دادید ؟ یعنی میانگین رو حذف کردید بعد تصاویری که قبلا تست کرده بودید و دقتش رو داشتید دوباره با اینجا تست کردید ؟ (معمولا بدون میانگین دقتا کاهش پیدا میکنه. نکته اینه که هردوجا بدون میانگین تست کنید تا بتونید متوجه بشید آیا هر دوجا دقت مساوی میگیرید یا نه . کاری نداریم کمتر یا بیشتر . دقت هم در کفی بدون میانگین و هم اینجا بدون میانگین باید یکی باشه . (وقتی بود با میانگین انجام میدیم اگه اکی بود سناریوهای دیگه رو ازمایش میکنیم ).
برای تبدیل میانگین از این اسکریپت استفاده کنید چیزی که قبلا خودم استفاده کردم :
https://gist.github.com/Coderx7/26eebeefaa3fb28f654d2951980b80ba
اینو انجام بدید بعد اطلاع بدید نتیجه چی شد تا انشاءالله سناریوهای بعدی چک بشه تا مشکل کامل برطرف بشه.
بله. منم از یه میانگین که از ترین بدست میومد همیشه استفاده کردم. این بار یه لحظه فکر کردم شاید اشتباه میکنم و برای تست هم ساختم. که گفتید اشتباهه و متوجه شدم.
من فایل های میانگین را از شبکه ام برداشتم و همونظور که بنظر میرسید دقتم کم شد. از 98 درصد که با استفاده از میانکین بود به 97 درصد بدون استفاده از میانگین کاهش پیدا کرد. بعد همین کفی مدل که بدست اومد رو در اسکریپت استخراج ویژگی استفاده کردم. درون این اسکریپت هم فایل مین را برداشتم. چون فایل دیپلوی لایه دقت نداره نمیدونم اینجا دقتش چند میشه . فقط توی تست تصاویر یه چیزی اتفاق افتاد. اینکه قبلا یعنی با استفاده از مین فایل، لیبل ها رو کاملا قاطی و در هم پیش بینی میکرد مثلا از 14 تصاویر درون پوشه یک، یکیشو میگفت یک، بعدیشو میگفت 13بعدیش رو مثلا میگفت دو. یعنی در هم بود. و ممکن بود از برخی لیبل ها اصلا استفاده نشه. ولی الان با اینکه بازم اشتباه بیش بینی میکنه ولی منظمه.یعنی انکه من چون 14 تصویر در هر پوشه تستم دارم، و همون تصاویر رو هم به عنوان ورودی میدم ، میاد 14 بار تصویر اول رو پیش بینی میکنه بعد میره 14 بار تصویر بعدی را به عنوان لیبل پیش بینی انتخاب میکنه. بعد 14 بار تصویر سوم را بیش بینی میکنه. یعنی 14*14= 196 بار . یعنی 196 تصویر اول فایلم رو میگه پوشه یک. بعد 196 تصویر بعدی را 2 لیبل میزنه. بعد 196 تصویر بعدی را 3 لیبل میزنه و همینطور الی اخر. یعنی هم منظم شده و دیگه قاطی نیست هم اینکه داره همه لیبل ها را پیش بینی میکنه و به طور صعودی میره بالا. به نظرتون از  چی میتونه باشه؟ وقتی درست پیش بینی میکنه که برای 14 تصویر اول بگه 1. برای 14 تصویر بعدی بگه 2 و الی اخر.....
از یک اسکریپت استفاده کردم که در لینک زیر هست:
https://groups.google.com/forum/#!topic/caffe-users/6OOcM-XfvOI
این هم ماتریس اغتشاش رو چاب میکنه هم لیبل های غلط و درست رو میگه. با توجه به ران همین اسکریپت دقیقا همون دقتی را گرفتم که در فاین تون شبکه میگرفتم. یعنی 97.6 درصد. بعد نشونم داد که 56 عکسم رو اشتباه پیش بینی میکنه و باقی را درست. خیلی اسکریپت جالب و خوبیه. کاملا واضح و روشنه. منتهی من هنوز نمی فهمم چرا با اسکریپت استخراج ویژگی که فایل دیپلوی و کفی مدل و تست رو بش میدادیم اینقد اشتباه پیش بینی میکنه. ولی با این اسکریپت در این وب سایت که ورودی اسکریپت همیناست، اینقد درست و کامل خروجی میده. البته یکی از ورودی هاش فایل lmdb تست هست نه فایل تکست تست. فکر میکنم به همون خاطر باشه. درسته؟
ممنون از کدی که برای تبدیل protoبه npy قرار دادید و ممنون میشم اگر کمکم کنید.
سلام . برای دیدن دقت نیازی به accuracy ندارید. میتونید از همون خروجی انتهای شبکه( pred ) استفاده کنید و درصدها رو ببینید.
در مورد confusion matrix هم من قبلا یه اسکریپت کامل نوشتم که اینجا میتونید تست کنید :
https://gist.github.com/Coderx7/205651853a248a512256aa21f1d3bec0
این اسکریپت از چیزی که شما استفاده کردید اطلاعات خیلی بیشتر و بهتری رو میده .
فقط من متوجه نشدم الان همه چیز رو به راه شده برای شما یا هنوز مشکل دارید ؟
من انشاءالله فردا رسیدم متن شما رو کامل میخونم و اسکریپت رو هم یکبار دیگه چک میکنم خودم اگر مشکل از اسکریپت باشه تصحیح میکنم و لینکش رو میزارم اینجا.
تا فردا هم اگر اطلاعات خاصی کسب کردید لطفا اطلاع بدید تا من در جریان باشم.
سلام
من اسکریپت رو چک کردم اسکریپت صحیح هست و مشکلی نداره . فقط یک نکته ای که بنظرم اومد مشکل شما از اون  نتیجه شده باشه بحث استفاده از متد predict هست . اینجا برخلاف یک forward pass ساده که در کفی و همینطور در اسکریپت هایی که من قبلا نوشتم ، یک فاز Pass روی چند ناحیه از تصویر ورودی اجرا میشه و بعد میانگین گرفته میشه و نهایتا گزارش میشه نتیجه.
این کار عموما دقت رو بالا میبره مگه اینکه اون کراپ هایی که گرفته میشه شبکه به اندازه کافی ترین نشده باشه و نتونه تشخیص بده اونارو و اینطور دقت میاد پایین .
برای تست و فهمیدن اینکه نکته این هست یا نه خیلی راحت بجای استفاده از تابع predict خروجی فوروارد پس رو بگیرید مثل چیزی که در اسکریپت confusion matrix فرستادم و از اون استفاده کنید.
...