In[]:=
data[folder_]:=Module[{img,txt,dat,output},img=Table[Import[ToString[folder]<>"\\"<>ToString[i]<>".png"],{i,Length[FileNames[All,folder]]/2}];txt=Table[If[Length[Import[ToString[folder]<>"\\"<>ToString[i]<>".txt","Data"]]==1,{ToExpression[#]&/@Import[ToString[folder]<>"\\"<>ToString[i]<>".txt","Words"]},Import[ToString[folder]<>"\\"<>ToString[i]<>".txt","Data"]],{i,Length[FileNames[All,ToString[folder]]]/2}];;output=Table[Thread[img[[i]]->{Thread[(Rectangle[{(#2-#4/2),((1-#3)-#5/2)},{(#2+#4/2),((1-#3)+#5/2)}]&@@@txt[[i]])->(ToString[#1]&@@@txt[[i]])]}],{i,Length[txt]}];Flatten[output]]
In[]:=
anchorboxes[folder_,k_]:=Module[{txt,wh,clusters,anchors},txt=Flatten[Table[If[Length[Import[ToString[folder]<>"\\"<>ToString[i]<>".txt","Data"]]==1,{ToExpression[#]&/@Import[ToString[folder]<>"\\"<>ToString[i]<>".txt","Words"]},Import[ToString[folder]<>"\\"<>ToString[i]<>".txt","Data"]],{i,Length[FileNames[All,ToString[folder]]]/2}],1];wh={#4,#5}&@@@txt;clusters=FindClusters[wh,k,Method"KMeans"];anchors=Mean/@clusters]
In[]:=
dataset=data["E:\\University Assignments\\Thesis 1\\Nueral net\\Bassel"];
In[]:=
anchors=anchorboxes["E:\\University Assignments\\Thesis 1\\Nueral net\\Bassel",3]
Out[]=
{{0.0984638,0.108101},{0.0755408,0.0256554},{0.205848,0.0250436}}
In[]:=
trainingset[folder_]:=Module[{img,txt,classes,enc,set},img=Table[File[ToString[folder]<>"\\"<>ToString[i]<>".png"],{i,Length[FileNames[All,folder]]/2}];txt=Table[If[Length[Import[ToString[folder]<>"\\"<>ToString[i]<>".txt","Data"]]==1,{ToExpression[#]&/@Import[ToString[folder]<>"\\"<>ToString[i]<>".txt","Words"]},Import[ToString[folder]<>"\\"<>ToString[i]<>".txt","Data"]],{i,Length[FileNames[All,ToString[folder]]]/2}];classes=#1&@@@Flatten[txt,1]//DeleteDuplicates;enc=NetEncoder[{"Class",classes,"IndicatorVector"}];set=Table[Thread[img[[i]]]->Join[{#2,#3,#4,#5}&@@@txt[[i]],enc[#1]&@@@txt[[i]],2],{i,Length[txt]}]]
In[]:=
trainingset["E:\\University Assignments\\Thesis 1\\Nueral net\\Bassel"];
In[]:=
ncoords=4;
In[]:=
nclasses=2;
In[]:=
w=h=13;
In[]:=
yolov2=NetModel["YOLO V2 Trained on MS-COCO Data"]
Out[]=
NetGraph
In[]:=
conv=NetTake[yolov2,{NetPort["Input"],NetPort[{"Conv","Output"}]}]
Out[]=
NetGraph
In[]:=
newconv=NetReplacePart[conv,{{"Conv","end",1}->ConvolutionLayer[Length[anchors]*(ncoords+1+nclasses),1,"PaddingSize"0,1,"Dilation"1],{"Output"}->{Length[anchors](ncoords+1+nclasses),w,h}}]
Out[]=
NetGraph
regionLayerNet[gridSize:{w_,h_},anchors_,nCoords_,nClasses_]:=NetGraph[{"Reshape"ReshapeLayer[{Length[anchors],nCoords+1+nClasses,w,h}],"Transpose"TransposeLayer[],"Centers"{PartLayer[1;;2],ElementwiseLayer["Sigmoid"]},"Sizes"PartLayer[3;;4],"Coordinates"CatenateLayer[],"Confidence"{PartLayer[nCoords+1],ElementwiseLayer["Sigmoid"],FlattenLayer[]},"ClassScore"{PartLayer[nCoords+2;;All],SoftmaxLayer[1],FlattenLayer[-2],TransposeLayer[]}},{"Reshape""Transpose","Transpose""Centers""Coordinates","Transpose""Sizes""Coordinates","Coordinates"NetPort["Coordinates"],"Transpose""Confidence"NetPort["Objectness"],"Transpose""ClassScore"NetPort["ClassProb"]},"Input"{Length[anchors](nCoords+1+nClasses),w,h}];
coord2box[gridSize:{w_,h_},anchors_,nCoords_,nClasses_]:=With[{grid=Transpose[Table[{i,j},{j,0,w-1},{i,0,h-1}],{2,3,1}],n=Length[anchors]},With[{gridLayer=NetArrayLayer["Array"ReplicateLayer[n,2][grid]],anchorLayer=NetArrayLayer["Array"ReplicateLayer[{w,h},3][Transpose[anchors]]],scaleLayer=NetArrayLayer["Array"ReplicateLayer[{n,w,h},2][{w,h,w,h}]]},NetGraph[{"Centers"PartLayer[1;;2,"Input"{nCoords,n,w,h}],"ScaledCenters"TotalLayer[],"Sizes"{PartLayer[3;;4],ElementwiseLayer[Exp]},"ScaledSizes"ThreadingLayer[Times],"ScaledCoord"CatenateLayer[],"NormalizedCoord"ThreadingLayer[Divide],"FlattenedCoord"FlattenLayer[-2],"CoordList"TransposeLayer[],"Grid"gridLayer,"Scale"scaleLayer,"Anchors"anchorLayer},{NetPort["Input"]"Centers""ScaledCenters""ScaledCoord","Grid""ScaledCenters",NetPort["Input"]"Sizes""ScaledSizes""ScaledCoord","Anchors""ScaledSizes",{"ScaledCoord","Scale"}"NormalizedCoord""FlattenedCoord""CoordList"},"Input"{nCoords,n,w,h}]]];

