maskrcnn数据集手动标注太慢怎么办?数据集太多怎么办?
首先你需要先手工标注你要的数据集中一小部分,大概几百张的样子。。
然后训练一个小的模型,可以识别出大致轮廓即可
现在就可以用下面的办法了。
用训练好的模型对图片进行识别,得到对应的目标轮廓,根据labelme json文件格式生成对应的标准文件。
如下代码为生成对对应的json文件
void writeLabelMe(Mat img,string name,vector<string> typeName,vector<vector<Point>> contours)
{
ofstream out(output_path+name+".json");
out<<"{"<<endl;
out<<"\"shapes\": ["<<endl;
for(int i=0;i<contours.size();i++)
{
out<<" {"<<endl;
out<<" \"line_color\": null,"<<endl
<<" \"points\": ["<<endl;
for(int j=0;j<contours[i].size();j++)
{
out<<" [\n"
<<" "<<contours[i][j].x<<",\n"
<<" "<<contours[i][j].y<<"\n";
if(j!=contours[i].size()-1)
{
out<<" ],"<<endl;
}
else
{
out<<" ]"<<endl;
}
}
out<<" ], "<<endl;
out<<" \"fill_color\": null,"<<endl;
out<<" \"label\": \""+typeName[i]+"\""<<endl;
if(i!=contours.size()-1)
out<<" },"<<endl;
else
out<<" }"<<endl;
}
out<<" ], "<<endl;
out<<" \"lineColor\": [0,255,0,255],"<<endl;
out<<"\"imagePath\": \""+name+".png\","<<endl;
out<<" \"flags\": {}, "<<endl;
out<<" \"fillColor\": [255,0,0,128],"<<endl;
vector<uchar> vecImg; //Mat 图片数据转换为vector<uchar>
vector<int> vecCompression_params;
vecCompression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
vecCompression_params.push_back(3);
imencode(".png", img, vecImg, vecCompression_params);
ZBase64 base64;
string imgbase64 = base64.Encode(vecImg.data(), vecImg.size());
//cout<<imgbase64<<endl;
out<<" \"imageData\":\""+imgbase64+"\""<<endl;
out<<"}"<<endl;
out.close();
}
效果图