{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"},{"sourceId":252013,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":215453,"modelId":237159}],"dockerImageVersionId":30840,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install ultralytics","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd \nimport cv2 as cv\nimport torch\nimport os \nimport psutil\nimport copy\nfrom ultralytics import YOLO\n\n\ntrain_file_path_local = r\"C:\\Users\\ADMIN\\Downloads\\digit-recognizer\\train.csv\"\ntest_file_path_local  = r\"C:\\Users\\ADMIN\\Downloads\\digit-recognizer\\test.csv\"\ntrain_file_path_in_kaggle = r\"/kaggle/input/digit-recognizer/train.csv\"\ntest_file_path_in_kaggle  = r\"/kaggle/input/digit-recognizer/test.csv\"\ntrain_file_path = train_file_path_in_kaggle\ntest_file_path =  test_file_path_in_kaggle\ntrain_df = pd.read_csv(train_file_path)\ntest_df  = pd.read_csv(test_file_path)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def change_series_to_gray_picture( series: pd.Series ) :\n    return np.array(series).astype(np.uint8).reshape(28,28)\n\n    \ndef create_dataset( log_errors , random_seed, ratio) :\n    if ratio > 1:\n        ratio /= 100\n\n    np.random.seed(random_seed)\n    num_pictures = train_df.shape[0]\n    index1 = [0]*10\n    index2 = [0]*10\n    path = 0\n    print(\" num_pictures = \", num_pictures)\n\n    for i in range(0,10):\n        os.makedirs( os.path.join(\"dataset/train\",str(i)) ,exist_ok=log_errors)\n        os.makedirs( os.path.join(\"dataset/val\",str(i))   ,exist_ok=log_errors)\n\n    for i in range(0,num_pictures):\n        arr  = train_df.iloc[i]\n        label = int(arr[0])\n        picture = change_series_to_gray_picture( arr[1: len(arr)] )\n\n        if np.random.uniform(0,1) <= ratio :\n            index1[label] += 1\n            name =  \"picture\"+ str(index1[label]) +\".jpg\"\n            path = os.path.join(\"dataset/train\",str(label),name )\n        else :\n            index2[label] += 1\n            name =  \"picture\"+ str(index2[label]) +\".jpg\"\n            path = os.path.join(\"dataset/val\",str(label),name )\n\n        cv.imwrite( path, picture)\n   \n    print(\" train array = \", index1 )\n    print(\" val array = \", index2)\n    print(\" train/num_picture = \", np.array(index1).sum(),\"/\",num_pictures )\n    print(\" val/num_picture = \",   np.array(index2).sum(),\"/\",num_pictures )\n\ncreate_dataset(True,69,85)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def get_model( model_path:str = None):\n    model = 0\n    my_device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n    if model_path != None:\n        model= YOLO(model_path)\n    else :\n        model= YOLO(\"yolo11n-cls.pt\")\n    model.to( device=my_device)\n    return model\n    \ndef training_model( model:YOLO,  num_epochs = 10 , batch_size=  None):\n    my_device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n    dataPath = r\"dataset\"\n    if my_device.type == \"cuda\":\n        free_vram = torch.cuda.mem_get_info()[0] / 1024**2  \n        total_vram = torch.cuda.mem_get_info()[1] / 1024**2\n        print(f\"VRAM còn trống: {free_vram:.2f} GB\")\n        print(f\"Tổng VRAM: {total_vram:.2f} GB\")\n        if batch_size == None:\n            model.train(data= dataPath, epochs=num_epochs , device= my_device)\n        else:\n            model.train(data= dataPath, epochs=num_epochs , device= my_device,batch = batch_size )\n    else :\n        free_ram = psutil.virtual_memory().available / 1024**3  \n        total_ram = psutil.virtual_memory().total / 1024**3 \n        print(f\"RAM còn trống: {free_ram:.2f} GB\")\n        print(f\"Tổng RAM: {total_ram:.2f} GB\")\n        if batch_size == None:\n            model.train(data= dataPath, epochs=num_epochs , device= my_device)\n        else:\n            model.train(data= dataPath, epochs=num_epochs , device= my_device,batch = batch_size)\nmodel = get_model(r\"/kaggle/input/yolo-nanavo-v11-classify-after-40-epochs-training/pytorch/default/1/best (1).pt\")\ntraining_model(model,num_epochs=1)\n# model = get_model() if you want to download model from yolo( yolo11n-cls.pt )\n# training_model(model,batch_ratio=0.7) set batch_ratio = None to avoid out of memory VRAM","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def get_result(model:YOLO ):\n    def chunk(arr, size):\n        print(\" size = \", size)\n        return [arr[i:i + size] for i in range(0, len(arr), size)]\n    \n    num_pictures = test_df.shape[0]\n    result_array,arr =[],[]\n\n    for i in range(0,num_pictures):\n        picture =  change_series_to_gray_picture( test_df.iloc[i] )\n        arr.append(picture)\n\n    arr = chunk(arr,min(len(arr),500))\n    for sub_arr in arr:\n        prediction    =  model.predict(sub_arr,verbose=False)\n        for i in prediction:\n            result_array.append( i.summary()[0][\"class\"])\n        \n    df = pd.DataFrame({\n        \"ImageId\": [ i+1 for i in range(0,len(result_array)) ],\n        \"Label\": result_array\n    })\n    df = df.astype(np.uint32)\n    df.to_csv(\"submission.csv\",index=False)\n\n\n\nif __name__ == \"__main__\":\n    model = get_model(r\"/kaggle/input/yolo-nanavo-v11-classify-after-40-epochs-training/pytorch/default/1/best (1).pt\")\n    get_result(model)\n    # 0.99257 score 220th rank","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}