به نام خدا : پروژه رنگ آمیزی تصاویر خاکستری مبتنی بر DNN در OpenCV.
توجه 1 : کد اصلی این مطلب، در مسیر opencv/samples/dnn/colorization.cpp قرار داره.
توجه 2 : این کد بر مبنای پروژه Colorful Image Colorization میباشد.
توجه 3 : در زیر 2 فایل مورد نیاز پروژه این مطلب که باید دانلود کنید رو مشاهده میکنید :
1 2 3 4 5 6 7 |
// MAIN SERVER [ model configuration ] https://raw.githubusercontent.com/richzhang/colorization/caffe/models/colorization_deploy_v2.prototxt [ model weights ] http://eecs.berkeley.edu/~rich.zhang/projects/2016_colorization/files/demo_v2/colorization_release_v2.caffemodel // DMF313.IR SERVER [ model configuration ] https://up.dmf313.ir/OpenCV/DNN/colorization/colorization_deploy_v2.prototxt [ model weights ] https://up.dmf313.ir/OpenCV/DNN/colorization/colorization_release_v2.rar |
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
#include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/dnn.hpp> #include <iostream> // the 313 ab cluster centers from pts_in_hull.npy (already transposed) static float hull_pts[] = { -90., -90., -90., -90., -90., -80., -80., -80., -80., -80., -80., -80., -80., -70., -70., -70., -70., -70., -70., -70., -70., -70., -70., -60., -60., -60., -60., -60., -60., -60., -60., -60., -60., -60., -60., -50., -50., -50., -50., -50., -50., -50., -50., -50., -50., -50., -50., -50., -50., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -40., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -30., -20., -20., -20., -20., -20., -20., -20., -20., -20., -20., -20., -20., -20., -20., -20., -20., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., -10., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 30., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 40., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 50., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 60., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 70., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 80., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 90., 100., 100., 100., 100., 100., 100., 100., 100., 100., 100., 50., 60., 70., 80., 90., 20., 30., 40., 50., 60., 70., 80., 90., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., -100., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., -100., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., -110., -100., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., -110., -100., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., -110., -100., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., -110., -100., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., -90., -80., -70., -60., -50., -40., -30., -20., -10., 0. }; int main(int argc, char **argv) { const cv::String keys = "{ proto | | model configuration }" "{ model | | model weights }" "{ image | | path to image file }"; cv::CommandLineParser parser(argc, argv, keys); // read image cv::String imageFile = parser.get<cv::String>("image"); CV_Assert(!imageFile.empty()); //--- cv::Mat src = cv::imread(imageFile); if (src.empty()) { std::cout << "Can't read image from file: " << imageFile << std::endl; return 2; } // create network object cv::String modelTxt = parser.get<cv::String>("proto"); cv::String modelBin = parser.get<cv::String>("model"); CV_Assert(!modelTxt.empty()); CV_Assert(!modelBin.empty()); //--- cv::dnn::Net net = cv::dnn::readNetFromCaffe(modelTxt, modelBin); // setup additional layers: int sz[] = {2, 313, 1, 1}; const cv::Mat pts_in_hull(4, sz, CV_32F, hull_pts); cv::Ptr<cv::dnn::Layer> class8_ab = net.getLayer("class8_ab"); class8_ab->blobs.push_back(pts_in_hull); cv::Ptr<cv::dnn::Layer> conv8_313_rh = net.getLayer("conv8_313_rh"); conv8_313_rh->blobs.push_back(cv::Mat(1, 313, CV_32F, cv::Scalar(2.606))); // extract L channel and subtract mean cv::Mat lab, L, input; src.convertTo(src, CV_32F, 1.0/255); cv::cvtColor(src, lab, cv::COLOR_BGR2Lab); cv::extractChannel(lab, L, 0); cv::resize(L, input, cv::Size(224, 224)); // fixed input size for the pretrained network input -= 50; // run the L channel through the network cv::Mat inputBlob = cv::dnn::blobFromImage(input); net.setInput(inputBlob); cv::Mat result = net.forward(); // retrieve the calculated a,b channels from the network output cv::Size siz(result.size[2], result.size[3]); cv::Mat a = cv::Mat(siz, CV_32F, result.ptr(0,0)); cv::Mat b = cv::Mat(siz, CV_32F, result.ptr(0,1)); cv::resize(a, a, src.size()); cv::resize(b, b, src.size()); // merge, and convert back to BGR cv::Mat dst, chn[] = {L, a, b}; cv::merge(chn, 3, lab); cv::cvtColor(lab, dst, cv::COLOR_Lab2BGR); cv::imshow("before", src); cv::imshow("after", dst); cv::waitKey(); return 0; } |
Command Line :
1 |
-proto=C:\Users\Mahdi\Desktop\colorization_deploy_v2.prototxt -model=C:\Users\Mahdi\Desktop\colorization_release_v2.caffemodel -image=C:\Users\Mahdi\Desktop\before.jpg |
نتیجه کد بالا : البته همیشه خروجی کار مثل تست زیر نمیشه، رو بعضی تصاویر نتیجه افتضاح میشه، برا اطلاعات بیشتر به سایت مرجع ( اول مطلب لینکشو گزاشتم ) مراجعه کنید.